问题描述
我最近开始学习Python,但我不明白为什么Python的行为如下:
>>> "OK" 'OK' >>> """OK""" 'OK' >>> "not Ok' File "<stdin>",line 1 "not Ok' ^ SyntaxError: EOL while scanning string literal >>> "not OK""" 'not OK'
为什么由于引号数量不匹配,最后一条语句没有给出错误?
解决方法
最后的"""
不能被识别为三引号,而是一个"
(用于关闭当前字符串文字)和一个空字符串""
;将两个并置的字符串文字串联在一起。通过在关闭"
和打开{{1}之间放置一个空格,可以更容易地识别相同的行为。
>>> "not OK" ""
'not OK'
,
"not OK"""
Python将此解释为"not OK"+""
如果输入"not Ok""ay"
,则输出将为'not Okay'
您可能会认为“或”之间没有区别,但实际上,Python使用贪婪的方法来接受输入。
一旦Python看到匹配的引号,然后该语句结束。
这就是为什么您可以编写类似"'s" ""
的原因。在字符串中有一个'
,但是由于您在字符串中,因此python不会引发错误。然后,之后是"
,后跟"
,但这是一个不同的(空)字符串。
如果您执行类似"s'
的操作,那么Python在运行命令之前会先查找下一个"
。
Python使用类似于堆栈的实现来检测引号的打开和关闭。 如果您知道堆栈是什么,它就是一个数据结构,其中的Last元素将首先被删除。
假设您的字符串是A = "''"
它的作用是,对于第一次遇到的每个单引号或双引号,都会将其添加到堆栈中,并且每秒都会将其从堆栈中删除,除非其当然"""
被解析为单引号一个
在我们的示例A = "''"
中,对其进行迭代,对于前2个元素,它们将被添加到堆栈中,对于接下来的2个元素,它们将被删除。
因此,当且仅当最后堆栈中的元素数必须为零时,引号才会匹配