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

Why is the escape character sometimes output in the interactive interpreter of Python?

如果我在 Python 的交互式解释器中输入:

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

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

单引号需要转义,因为字符串是用单引号分隔的。如果它没有被转义,那么它会发出文字结束的信号。

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

如果字符串是在外面用双引号复制的,那么双引号就需要转义:

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

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

我想以 John 的有用回答为基础。

examining the docs, 之后,我确定如果字符串通过双引号测试,它将输出双引号:

  1. 包含单引号
  2. 不包含双引号

这是最容易记住的方式。

文字 "doesn't" 由于撇号而通过了第一个测试,撇号算作单引号。然后,我们重新检查它,发现它不包含任何封闭内部的双引号。因此,字符串文字输出为双引号:

>>> "doesn't"
"doesn't"

输出中不需要用反斜杠转义单引号,因为括号是由双引号组成的!

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

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

并且由于括号由单引号组成,所以输出中需要转义。

如果输出中没有反斜杠,扫描文字时就会到达 EOL(行尾)。

最后,考虑"\"Isn't,\" they said."

文字中有一个单引号,所以它通过了第一个测试...但没有通过第二个。输出应将字符串文字括在单引号中:

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

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