为什么3个反斜杠在Pythonstring中等于4?
你能告诉我为什么'?\\\?'=='?\\\\?'
给True
? 这让我疯狂,我找不到合理的答案…
>>> list('?\\\?') ['?', '\\', '\\', '?'] >>> list('?\\\\?') ['?', '\\', '\\', '?']
基本上,因为Python在反斜杠处理方面略微宽松。 从https://docs.python.org/2.0/ref/strings.html引用:;
与标准C不同,所有无法识别的转义序列都保留在string中,即反斜杠保留在string中 。
(重点在原来的)
因此,在python中,三个反斜杠不等于四,就是当你跟着一个字符反斜杠的时候?
,两人一起来过两个人物,因为\?
不是一个公认的转义序列。
这是因为如果组合表示有效的转义序列,反斜杠将作为紧跟其后的字符的转义字符。 这里列出了十几个转义序列。 它们包括诸如换行符\n
,水平制表符\t
,回车符\r
以及诸如使用\N{...}
命名unicode字符,比如\N{WAVY DASH}
\u3030
。 关键点在于,如果转义序列是未知的,则字符序列保留在string中。
部分问题也可能是Python解释器的输出会误导你。 这是因为反斜杠在显示时被转义。 但是,如果您打印这些string,则会看到额外的反斜杠消失。
>>> '?\\\?' '?\\\\?' >>> print('?\\\?') ?\\? >>> '?\\\?' == '?\\?' # I don't know why you think this is True??? False >>> '?\\\?' == r'?\\?' # but if you use a raw string for '?\\?' True >>> '?\\\\?' == '?\\\?' # this is the same string... see below True
对于你的具体例子,在第一个例子中'?\\\?'
,第一个\
退出第二个反斜杠留下一个反斜杠,但第三个反斜杠仍然是一个反斜杠,因为\?
不是有效的转义序列。 因此得到的string是?\\?
。
对于第二种情况'?\\\\?'
,第一个反斜杠转义第二个,第三个反斜杠转义第四个导致string?\\?
。
所以这就是为什么三个反斜杠和四个一样:
>>> '?\\\?' == '?\\\\?' True
如果你想创build一个带有3个反斜杠的string,你可以将每个反斜杠转义出来:
>>> '?\\\\\\?' '?\\\\\\?' >>> print('?\\\\\\?') ?\\\?
或者你可能会发现“原始”string更容易理解:
>>> r'?\\\?' '?\\\\\\?' >>> print(r'?\\\?') ?\\\?
这个转义string文字的转义序列处理。 有关更多细节,请参阅string文字 。
因为\x
在一个string中,当x
不是像n
, r
, t
, 0
等那样的特殊可逆字符之一时,计算出一个带有反斜杠和x
的string。
>>> '\?' '\\?'
从string文字下的python词法分析页面: https : //docs.python.org/2/reference/lexical_analysis.html
有一个表列出了所有识别的转义序列。
\\是一个转义序列=== \
\? 是不是一个转义序列,是=== \?
所以'\\\'是'\\',后面是'\\',这是'\\'(两个逃脱)
'\\'是'\\',后面跟'\'也是'\\'(一个是\和一个raw \)
另外,应该指出的是,python不区分单词和双引号围绕string文字,不像其他一些语言。
所以'String'和'String'在python中是完全一样的,它们不会影响转义序列的解释。
mhawke的回答几乎涵盖了它,我只是想用更简洁的forms来重述它,并用最less的例子来说明这种行为。
我猜想有一点需要补充的是,转义处理是从左到右移动的,所以\n
首先find反斜杠,然后寻找一个字符来逃跑,然后findn
并逃脱它; \\n
find第一个反斜杠,find第二个并将其转义,然后findn
并将其视为字面n; \?
发现反斜杠,并寻找一个字符逃脱,发现?
这是不能逃脱的,所以把\
作为一个文字反斜杠。
正如mhawke指出的那样,这里的关键是交互式解释器在显示string时转义反斜杠。 我猜的原因是确保从解释器复制到代码编辑器的文本string是有效的Pythonstring。 但是,在这种情况下,为了方便起见,这种补贴会造成混乱。
>>> print('\?') # \? is not a valid escape code so backslash is left as-is \? >>> print('\\?') # \\ is a valid escape code, resulting in a single backslash '\?' >>> '\?' # same as first example except that interactive interpreter escapes the backslash \\? >>> '\\?' # same as second example, backslash is again escaped \\?