ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

由于引号的数量不匹配,为什么最后一条语句没有出错?

如果您更喜欢正式文档,则为 here
只是为了提供更多见解:我认为让您感到困惑的是您将 """OK""" 解释为“引号中的引号”"("("OK")")",但事实并非如此。三引号("""''')虽然由三个字符组成,但被视为开始(和结束)多行逐字字符串的单个符号(请参阅 this)。你不能真正嵌套引号;在 "foo 'bar'"'foo "bar"' 之类的东西中,内引号被视为普通字符,所以这也可以工作 "foo ' bar"

c
chepner

最后的 """ 不被识别为三引号,而是单个 "(关闭当前字符串文字)后跟一个空字符串 "";两个并列的字符串文字被连接起来。通过在结束符和开始符 " 之间放置一个空格,可以更容易地识别相同的行为。

>>> "not OK" ""
'not OK'

进一步推动这个家:>>>"ok"''>>>'ok'""
旁白:@DukeSilver 不要认为将 >>> 放在代码片段前面在评论中的效果与在问题和答案中的效果一样好。对某些人来说,它可能看起来像您正在使用的一个奇怪的外星运算符,而 "ok"'' 却非常清晰。
@PaulEvans 这是 Python 控制台在您输入的每一行前面放置的标记。
@nick012000 我知道,这就是为什么它在问答中运行良好的原因。我的观点是,这在评论中是不必要的并且可能会造成混淆。
P
Pranav Hosangadi

"not OK"""

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

如果您提供 "not Ok""ay",您将获得 'not Okay' 的输出


"""""""" ok "" 文件 "",第 1 行 """""""" ok "" ^ SyntaxError: 无效语法。 “”“好”呢?它给了我一些奇怪的东西
"""ok" ,所以在 python 中,如果需要,""" 三引号用于创建多行字符串。因此,当 python 找到三引号时,它会查找该开头三引号的结尾三引号。
当 Python 扫描开头引号时,它更喜欢三引号而不是普通引号。但是一旦开盘报价确定,收盘报价也随之确定;因此,如果字符串以普通双引号开头,则另一端只使用一个双引号,之后的任何内容都是下一个标记的一部分。
Z
ZexalDaBeast

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

一旦 Python 看到匹配的引号,则该语句结束。

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

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


为什么称这种方法为“贪婪”?
因为这是对采用“适合的第一件事”的一类算法的一般描述,即使以后的选择会更好。
这不是“贪婪”的意思。贪婪意味着当您使用像 A.*B 这样的正则表达式来匹配字符串时,它最终会匹配像 ABBB 而不仅仅是 AB 这样的东西,因为正则表达式是“贪婪的”。
支持上面的 Pat-Laugh:这实际上与贪婪完全相反:这是一种惰性算法。
不过,它并不完全是懒惰的。 """ 起始引号是贪婪的。 (不过,大多数事情都是懒惰的。)
A
Aroo

Python 使用类似堆栈实现来检测引号的打开和关闭。如果您知道堆栈是什么,它是一个数据结构,其中 Last 元素将首先被删除。

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

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

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


因此,如果字符串是 "'",它不会允许它,因为在解析所有字符串后堆栈不为空??这是不正确的。

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅