我最近开始学习 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'
"not OK"""
Python 将其解释为 "not OK"+""
如果您提供 "not Ok""ay"
,您将获得 'not Okay'
的输出
你会认为 " 或 ' 之间没有区别,但实际上,Python 使用贪婪的方法来接受输入。
一旦 Python 看到匹配的引号,则该语句结束。
这就是为什么您可以编写类似 "'s" ""
的内容。在字符串里面有一个 '
但因为你在一个字符串中,python 不会引发错误。然后在那之后,有一个 "
后跟 "
但这是一个不同的(空)字符串。
如果您执行 "s'
之类的操作,那么 Python 会在 if 运行您的命令之前寻找下一个 "
。
A.*B
这样的正则表达式来匹配字符串时,它最终会匹配像 ABBB
而不仅仅是 AB
这样的东西,因为正则表达式是“贪婪的”。
"""
起始引号是贪婪的。 (不过,大多数事情都是懒惰的。)
Python 使用类似堆栈实现来检测引号的打开和关闭。如果您知道堆栈是什么,它是一个数据结构,其中 Last 元素将首先被删除。
假设您的字符串是 A = "''"
它的作用是,对于第一次遇到的每个单引号或双引号,它会将其添加到堆栈中,并且每隔一秒,它将从堆栈中删除,除非它当然是 """
将被解析为单个
在我们的示例中,A = "''"
对其进行迭代,对于前 2 个元素,它们将被添加到堆栈中,对于接下来的 2 个,它们将被删除。
所以引号将被匹配,当且仅当,最后堆栈中的元素数量必须为零
"'"
,它不会允许它,因为在解析所有字符串后堆栈不为空??这是不正确的。
>>>"ok"''
和>>>'ok'""
>>>
放在代码片段前面在评论中的效果与在问题和答案中的效果一样好。对某些人来说,它可能看起来像您正在使用的一个奇怪的外星运算符,而"ok"''
却非常清晰。