有人可以解释以下内容:
In [9]: str( """w'o"w""")
Out[9]: 'w\'o"w'
为什么双引号无法逃脱?无论有没有逃脱它都会做同样的事情:
In [10]: print ( 'w\'o"w')
w'o"w
In [11]: print ( 'w\'o\"w')
w'o"w
在以下两种情况下,没有逃脱:
In [12]: str( """w'o'w""")
Out[12]: "w'o'w"
In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
但它们仍然等同于它们的转义版本:
In [14]: str("w\'o\'w")
Out[14]: "w'o'w"
In [15]: str( "w\"o\"w")
Out[15]: 'w"o"w'
有人可以向我解释为什么Python会出现这种“不一致”吗?拥有它们的优点是什么?
答案 0 :(得分:4)
当Python控制台(包括IPython)显示字符串的值时,它会通过打印字符串的repr()
来实现。 repr()
将生成可由Python解析器解析的输出,因此必要时将包含反斜杠转义。 (并且只在必要时)。如果字符串中的所有引号都是单引号,repr()
将显示带有双引号的字符串,不需要反斜杠。如果字符串中的所有引号都是双引号,repr()
将显示带有单引号的字符串,不需要反斜杠。如果字符串包含混合的单引号和双引号,则需要反斜杠。
至于print()
来电的内容 - 他们没有打印字符串的repr()
,他们会显示str()
的{{1}}值该字符串,这是字符串本身没有添加反斜杠转义(并且没有引号)。
所以,这是你的每个例子中发生的事情:
In [9]: str( """w'o"w""")
Out[9]: 'w\'o"w'
您正在获取字符串w'o"w
的值,而IPython正在输出中显示值。所以它在值上调用repr()
,它在它周围加上引号和反斜杠。
In [10]: print ( 'w\'o"w')
w'o"w
您正在打印字符串w'o"w
,而不是获取其值。所以IPython正在显示打印的字符串。请注意,没有Out[10]
- print()
函数返回None
,而IPython在None
时会抑制输出值。
In [11]: print ( 'w\'o\"w')
w'o"w
同样的事情:你打印字符串,而不是IPython显示你的价值。因此它使用str()
,而不是repr()
。
In [12]: str( """w'o'w""")
Out[12]: "w'o'w"
这里显示的是字符串的值,因此它会引用它的引号。但没有反斜杠,因为它们不需要代表字符串。
In [13]: str( """w"o"w""")
Out[13]: 'w"o"w'
同上:没有反斜杠,因为他们不需要代表字符串。
In [14]: str("w\'o\'w")
Out[14]: "w'o'w"
同上:repr()
输出中没有反斜杠,因为它们不需要代表字符串。
In [15]: str( "w\"o\"w")
Out[15]: 'w"o"w'
同样在这里:repr()
输出中没有反斜杠,因为它们不需要代表字符串。
我希望这可以帮助您了解更好的内容。
答案 1 :(得分:0)
当你用single quotes
括起一个字符串时,你需要转义字符串中的single quotes
- 否则解释器将如何知道字符串是否要结束?
相反,当你用double quotes
括起一个字符串时,你需要转义字符串中的double quotes
。
"""
是一个例外 - 它足够聪明,可以根据所包含字符串的内容来改变它的行为。如果您包含一个包含单引号的String,它的行为就像您用双引号括起来一样。如果你附上一个包含双引号的字符串,if就像你用单引号括起来一样
答案 2 :(得分:0)
你必须逃避字符串字符的开头/结尾的唯一原因是编译器/解释器知道该符号并不意味着字符串范围的开始/结束。
因此,如果字符为'
,则'
会成为特殊字符,"
则不会。反之亦然。如果你用'''
或"""
(多行字符串)启动它,那么两个字符都不是特殊的,因此也不需要转义。