如果我在 Python 的交互式解释器中输入:
>>> 'doesn\'t'
"doesn't"
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
为什么\
在第二种情况下会打印转义字符 ( )?我意识到我可以使用该print()
功能来逃避它,即不打印它。
如果我在 Python 的交互式解释器中输入:
>>> 'doesn\'t'
"doesn't"
>>> '"Isn\'t," they said.'
'"Isn\'t," they said.'
为什么\
在第二种情况下会打印转义字符 ( )?我意识到我可以使用该print()
功能来逃避它,即不打印它。
单引号需要转义,因为字符串是用单引号分隔的。如果它没有被转义,那么它将标志着文字的结束。
'"Isn\'t," they said.'
^ ^
如果字符串在外部用双引号复制,则需要对双引号进行转义:
"\"Isn't,\" they said."
两种形式都代表完全相同的字符串。碰巧,repr()
选择使用单引号并以第一种方式显示。
我想以约翰的有用答案为基础。
检查文档后,我确定如果字符串通过了 DOUBLE 测试,它将输出 DOUBLE 引号:
这是最容易记住的方式。
文字"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。