我最近开始学习Python,但我不明白为什么Python会像这样表现:
>>> "OK" 'OK' >>> """OK""" 'OK' >>> "not Ok' File "<stdin>", line 1 "not Ok' ^ SyntaxError: EOL while scanning string literal >>> "not OK""" 'not OK'
为什么最后一条语句没有报错?因为引号的数量不匹配。
我最近开始学习Python,但我不明白为什么Python会像这样表现:
>>> "OK" 'OK' >>> """OK""" 'OK' >>> "not Ok' File "<stdin>", line 1 "not Ok' ^ SyntaxError: EOL while scanning string literal >>> "not OK""" 'not OK'
为什么最后一条语句没有报错?因为引号的数量不匹配。
最终的"""
不被识别为三引号,而是一个单个的"
(用于关闭当前的字符串字面量),后跟一个空字符串""
;两个并置的字符串字面量将被连接。通过在关闭和打开"
之间放置一个空格,可以更容易地识别相同的行为。
>>> "not OK" ""
'not OK'
>>>"ok"''
和 >>>'ok'""
- DukeSilver>>>
会起到同样的作用。对于一些人来说,这可能看起来像是你在使用奇怪的外星操作符,而 "ok"''
则是完全可读的。 提示:在评论中使用 >>>
来引用代码片段可能不如在问题和答案中有效。对于一些人来说,这可能看起来像是一个奇怪的外星运算符,而 "ok"''
更容易理解。请注意保持原意并使语言更通俗易懂。 - Paul Evans"not OK"""
Python 解释为 "not OK"+""
如果你输入 "not Ok""ay"
,将会得到输出结果为 'not Okay'
's""
" 这样的东西。字符串中有一个 '
,但因为你在一个字符串中,Python不会报错。然后,在此之后,有一个 "
,跟随着另一个(空)字符串。"s'
这样的操作,Python会在运行命令之前查找下一个 "
。A.*B
的正则表达式匹配一个字符串时,它会匹配像ABBB
这样的字符串,而不仅仅是AB
,因为该正则表达式是“贪婪”的。 - user"""
开始引用是贪婪的。(虽然大多数东西都是懒惰的。) - wizzwizz4Python使用类似于栈的实现来检测引号的开启和关闭。 如果你知道什么是栈,它是一种数据结构,其中最后一个元素将首先被移除。
假设你的字符串是A = "''"
它的作用是,对于每个第一次遇到的单引号或双引号,它将其添加到堆栈中,对于每个第二个,则将其从堆栈中移除,除非当然是"""
,这将被解析为单个引号
在我们的例子中,A = "''"
,迭代它,对于前两个元素,它们将被添加到堆栈中,对于接下来的两个元素,它们将被移除。
因此,只有在结束时堆栈中的元素数量为零时,引号才会匹配。
"'"
,它不会被允许,因为在解析整个字符串后堆栈不为空?这是不正确的。 - Asocia
"""OK"""
解释为一个 "引号内嵌套引号" 的"("("OK")")"
,但实际上不是这样的。三重引号 ("""
或'''
),虽然由三个字符组成,但被视为一个单独的符号,用于开始(和结束)一个多行的原样字符串(参见这里)。你不能真正地嵌套引号;在像"foo 'bar'"
或'foo "bar"'
这样的东西中,内部引号被视为普通字符,所以这也可以工作"foo ' bar"
。 - Filip Milovanović