当字符串周围的引号不匹配时,为什么 Python 不给出任何错误?

Why doesn't Python give any error when quotes around a string do not match?

我最近开始学习Python,我不明白为什么Python会这样:

>>> "OK"
'OK'
>>> """OK"""
'OK'
>>> "not Ok'
  File "<stdin>", line 1
    "not Ok'
           ^
SyntaxError: EOL while scanning string literal
>>> "not OK"""
'not OK'

为什么最后一条语句不报错,因为引号数不匹配?

最后的 """ 不被识别为 triple-quotation,而是单个 "(关闭当前字符串文字)后跟一个空字符串 "";两个并列的字符串文字被连接起来。通过在关闭和打开 ".

之间放置 space 可以更容易地识别相同的行为
>>> "not OK" ""
'not OK'

"not OK"""

Python 将其解释为 "not OK"+""

如果你给出 "not Ok""ay",你将得到 'not Okay'

的输出

你会认为"或'没有区别,但实际上,Python使用贪婪的方法来接受输入。

一旦 Python 看到匹配的引文,语句就结束了。

这就是为什么你可以写出类似 "'s" "" 的原因。在字符串中有一个 ' 但因为你在一个字符串中, python 不会引发错误。然后在那之后,有一个 " 后跟 " 但那是一个不同的(空)字符串。

如果您执行类似 "s' 的操作,那么 Python 会在运行您的命令之前寻找下一个 "

Python 使用类似于堆栈的实现来检测报价的开盘和收盘。 如果你知道堆栈是什么,它是一种数据结构,其中最后一个元素将首先被删除。

假设您的字符串是 A = "''" 它所做的是,对于第一次遇到的每个单引号或双引号,它将把它添加到堆栈中,并且每隔一秒,它将从堆栈中删除,当然,除非 """ 将被解析为单引号一个

在我们的示例中,A = "''",对其进行迭代,对于前 2 个元素,它们将被添加到堆栈中,对于接下来的 2 个,它们将被删除。

所以引号匹配,当且仅当最后栈中的元素个数必须为零