引号中的引号
Quotes within quotes
在Python 3.x:
print(""s"") # SyntaxError
print("""s""") # prints s
print(""""s"""") # SyntaxError
print("""""s""""") # prints ""s
当字符串中有不同数量的双引号时,这种不同行为背后的原因是什么?
在 Python 中,您可以使用 """..."""
创建多行字符串。引用 documentation for strings,
String literals can span multiple lines. One way is using triple-quotes: """..."""
or '''...'''
.
在你的第一种情况下,""s""
是这样解析的
"" (empty string literal) s "" (empty string literal)
现在,Python 不知道如何处理 s
。这就是为什么 SyntaxError
.
失败的原因
在你的第三种情况中,字符串是这样解析的
""" "s """ (End of multiline string) `"`
现在最后一个 "
没有匹配的 "
。这就是它失败的原因。
最后一种情况,"""""s"""""
是这样解析的
""" ""s """ ""
所以,多行字符串被成功解析,然后它旁边有一个空字符串文字。在 Python 中,您可以将两个字符串文字并排连接起来,就像这样
print ("a" "b")
# ab
因此,最后一个空字符串文字与 ""s
.
连接
从 C 继承的字符串文字连接规则对此负责。考虑一下:
x = "a" "b"
根据 Python 语法,两个字符串合二为一。
另一个方面是三引号字符串(用于多行字符串,如 doc 字符串)也存在,这进一步使问题复杂化。在那里,开始的三重引号与下一个三重引号匹配。
现在,考虑一下您的情况,将每个双引号或三引号组合在一起。您会发现,在一种情况下,您在中间有一个标记 s
,有时 s
是字符串的一部分,有时在末尾有剩余的引号等。
要理解这一点,您需要了解两件事:
- 除了常规字符串
"foo"
Python 还有 多行字符串 ,用 three 打开和关闭引用 """foo"""
(参见 String Literals);和
- 连续的字符串文字被连接起来
"foo" "bar" == "foobar"
(参见 String Literal Concatenation)。
至于你的四个例子:
""s""
在 s
出现之前关闭单引号,因此等同于:
x = ""
x s x
这显然没有意义。
"""s"""
是一个单字符的多行字符串。
""""s""""
是一个多行字符串,包含两个字符 ("s
),后跟一个不匹配的引号。
"""""s"""""
是一个多行字符串,包含三个字符 (""s
) 连接到一个空字符串文字。
在Python 3.x:
print(""s"") # SyntaxError
print("""s""") # prints s
print(""""s"""") # SyntaxError
print("""""s""""") # prints ""s
当字符串中有不同数量的双引号时,这种不同行为背后的原因是什么?
在 Python 中,您可以使用 """..."""
创建多行字符串。引用 documentation for strings,
String literals can span multiple lines. One way is using triple-quotes:
"""..."""
or'''...'''
.
在你的第一种情况下,""s""
是这样解析的
"" (empty string literal) s "" (empty string literal)
现在,Python 不知道如何处理 s
。这就是为什么 SyntaxError
.
在你的第三种情况中,字符串是这样解析的
""" "s """ (End of multiline string) `"`
现在最后一个 "
没有匹配的 "
。这就是它失败的原因。
最后一种情况,"""""s"""""
是这样解析的
""" ""s """ ""
所以,多行字符串被成功解析,然后它旁边有一个空字符串文字。在 Python 中,您可以将两个字符串文字并排连接起来,就像这样
print ("a" "b")
# ab
因此,最后一个空字符串文字与 ""s
.
从 C 继承的字符串文字连接规则对此负责。考虑一下:
x = "a" "b"
根据 Python 语法,两个字符串合二为一。
另一个方面是三引号字符串(用于多行字符串,如 doc 字符串)也存在,这进一步使问题复杂化。在那里,开始的三重引号与下一个三重引号匹配。
现在,考虑一下您的情况,将每个双引号或三引号组合在一起。您会发现,在一种情况下,您在中间有一个标记 s
,有时 s
是字符串的一部分,有时在末尾有剩余的引号等。
要理解这一点,您需要了解两件事:
- 除了常规字符串
"foo"
Python 还有 多行字符串 ,用 three 打开和关闭引用"""foo"""
(参见 String Literals);和 - 连续的字符串文字被连接起来
"foo" "bar" == "foobar"
(参见 String Literal Concatenation)。
至于你的四个例子:
""s""
在 s
出现之前关闭单引号,因此等同于:
x = ""
x s x
这显然没有意义。
"""s"""
是一个单字符的多行字符串。
""""s""""
是一个多行字符串,包含两个字符 ("s
),后跟一个不匹配的引号。
"""""s"""""
是一个多行字符串,包含三个字符 (""s
) 连接到一个空字符串文字。