3

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

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

为什么\在第二种情况下会打印转义字符 ( )?我意识到我可以使用该print()功能来逃避它,即不打印它。

4

2 回答 2

3

单引号需要转义,因为字符串是用单引号分隔的。如果它没有被转义,那么它将标志着文字的结束。

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

如果字符串在外部用双引号复制,则需要对双引号进行转义:

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

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

于 2020-02-08T20:29:03.167 回答
1

我想以约翰的有用答案为基础。

检查文档后,我确定如果字符串通过了 DOUBLE 测试,它将输出 DOUBLE 引号:

  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。

于 2021-06-05T03:36:52.933 回答