有时为什么Python交互解释器会输出转义字符?

3
如果我在Python的交互式解释器中输入以下内容:
>>> 'doesn\'t'
"doesn't"
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'

为什么转义字符(\)在第二种情况下被打印出来?我意识到可以使用print()函数来转义它,即不打印它。

2
这是内部双引号,似乎强制Python解释器继续使用单引号并转义单引号以避免混淆。虽然我相信有更好的解释。 - Sayse
2个回答

3
单引号需要转义,因为字符串是用单引号分隔的。如果不进行转义,则会被视为字面量的结束符号。
'"Isn\'t," they said.'
^                    ^

如果字符串的外面加上双引号,那么双引号就需要被转义:

"\"Isn't,\" they said."

两种形式表示完全相同的字符串。恰好,repr() 选择使用单引号并以第一种方式显示。


问题不在于我为什么需要转义内部的单引号,而是解释器为什么在第二种情况下打印转义字符。 - jalalhugo
1
它打印出有效的Python代码,就像你自己输入的一样。你必须转义单引号,这样它也会输出。 - John Kugelman

1
我希望在John的有益回答上进一步阐述。
经过查看文档,我确定如果字符串通过了两倍的测试,那么它将输出双引号:
  1. 包含单引号
  2. 不包含双引号
这是最容易记住的方法。
字面意义上的"doesn't"之所以通过第一个测试,是因为它有一个撇号,被视为单引号。然后,我们重新检查它,发现它在封闭体内不包含任何双引号。因此,字符串字面值输出为双引号:
>>> "doesn't"
"doesn't"

在输出中不需要用反斜杠转义单引号,因为封闭符由双引号组成!

现在考虑字面量'"Isn\'t," they said.'。这个字面量通过了第一个测试,因为它包含一个撇号,即使它被转义了。但是,它还包含双引号,所以它未通过第二个测试。因此,它输出为单引号:

>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'

由于封闭是由单引号组成的,因此在输出中需要转义。
如果输出中没有反斜杠,则会在扫描文字时到达EOL(行末)。
最后,请考虑“\”他们说:“Isn't。””
文字内部有一个单引号,因此它通过了第一次测试……但未通过第二次测试。输出应该用单引号括起字符串文字。
>>> "\"Isn't,\" they said."
'"Isn\'t," they said.'

因此,需要转义以防止过早的 EOL。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接