在Python 3.x中:
print(""s"") # SyntaxError
print("""s""") # prints s
print(""""s"""") # SyntaxError
print("""""s""""") # prints ""s
当字符串中有不同数量的双引号时,这种不同行为背后的原因是什么?
答案 0 :(得分:6)
在Python中,您可以使用"""..."""
创建多行字符串。引用documentation for strings,
字符串文字可以跨越多行。一种方法是使用三引号:
"""..."""
或'''...'''
。
在您的第一种情况中,""s""
被解析为
"" (empty string literal) s "" (empty string literal)
现在,Python不知道如何处理s
。这就是SyntaxError
失败的原因。
在你的第三种情况中,字符串被解析为
""" "s """ (End of multiline string) `"`
现在最后一个"
没有匹配"
。这就是它失败的原因。
在最后一种情况中,"""""s"""""
被解析为
""" ""s """ ""
因此,多线字符串被成功解析,然后您旁边有一个空字符串文字。在Python中,您可以通过将它们彼此相邻地连接起来来连接两个字符串文字,就像这样
print ("a" "b")
# ab
因此,最后一个空字符串文字与""s
连接。
答案 1 :(得分:3)
要理解这一点,您需要了解两件事:
"foo"
一样,Python有多行字符串,使用三个引号"""foo"""
打开和关闭(请参阅String Literals });和"foo" "bar" == "foobar"
(请参阅String Literal Concatenation)。 至于你的四个例子:
""s""
在s
出现之前关闭单引号,因此相当于:
x = ""
x s x
这显然毫无意义。
"""s"""
是一个多行字符串,其中包含一个字符。
""""s""""
是一个包含两个字符("s
)的多行字符串,后跟一个不匹配的引号。
"""""s"""""
是一个多行字符串,包含连接到空字符串文字的三个字符(""s
)。
答案 2 :(得分:1)
从C继承的字符串文字串联规则对此负责。考虑一下:
x = "a" "b"
根据Python语法,两个字符串连接成一个字符串。
另一个方面是三重引用的字符串(用于多线字符串,如doc字符串)也存在,这进一步使问题复杂化。在那里,开头的三重报价与下一个三重报价相匹配。
现在,请考虑您的案例是轻量级,并将每个双引号或三重引号分组。您会发现,在一个案例中,您在中间有一个令牌s
,有时s
是字符串的一部分,有时末尾有剩余的引号等。