你能告诉我为什么'?\\\?'=='?\\\\?'给True吗?这让我发疯,我找不到合理的答案...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
你能告诉我为什么'?\\\?'=='?\\\\?'给True吗?这让我发疯,我找不到合理的答案...
>>> list('?\\\?')
['?', '\\', '\\', '?']
>>> list('?\\\\?')
['?', '\\', '\\', '?']
list()甚至不需要包括:>>> '?\\\?' '?\\\\?'
Answers:
基本上,因为python在反斜杠处理中稍微宽容。从https://docs.python.org/2.0/ref/strings.html引用:
与标准C不同,所有无法识别的转义序列都保留在字符串中不变,即,反斜杠保留在字符串中。
(强调原件)
因此,在python中,并不是三个反斜杠等于四个,而是当您在反斜杠后面加上字符时?,这两个字符一起成为两个字符,因为\?这不是公认的转义序列。
'escape''d')。您甚至不必在那里记住其他字符!
这是因为,如果组合表示有效的转义序列,则反斜杠将充当紧跟其后的字符的转义字符。这里列出了十几个转义序列。它们包括明显的字符\n,例如换行符,水平制表符\t,回车符,\r以及较晦涩的字符\N{...},例如使用命名的unicode字符,例如\N{WAVY DASH},表示unicode字符\u3030。但是,关键点在于,如果不知道转义序列,则字符序列将保留在字符串中。
问题的一部分可能还在于Python解释器的输出误导了您。这是因为显示时反斜杠已转义。但是,如果打印这些字符串,则会看到多余的反斜杠消失。
>>> '?\\\?'
'?\\\\?'
>>> 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 ?\\?。
因此,这就是三个反斜杠与四个反斜杠相同的原因:
>>> '?\\\?' == '?\\\\?'
True
如果要创建带有3个反斜杠的字符串,可以转义每个反斜杠:
>>> '?\\\\\\?'
'?\\\\\\?'
>>> print('?\\\\\\?')
?\\\?
否则您可能会发现“原始”字符串更容易理解:
>>> r'?\\\?'
'?\\\\\\?'
>>> print(r'?\\\?')
?\\\?
这将对字符串文字进行转义序列处理。有关更多详细信息,请参见字符串文字。
'?\\\?'=='?\\?'给False,我输错了。这应该是'?\\\?'=='?\\\\?'因为这个问题表明,我已经纠正它。
在python词法分析页面中的字符串常量下:https : //docs.python.org/2/reference/lexical_analysis.html
有一张表列出了所有可识别的转义序列。
\\是一个转义序列,它=== \
\?不是转义序列,而是=== \?
因此,“ \\\\”是“ \\”,后跟“ \\”即“ \\”(两个转义的\)
“ \\\”是“ \\”,后跟“ \”,后者也是“ \\”(一个转义的\和一个原始的\)
同样,应该注意的是,与某些其他语言不同,python不能区分字符串文字周围的单引号和双引号。
所以'String'和“ String”在python中是完全一样的,它们不影响转义序列的解释。
mhawke的答案几乎涵盖了这一点,我只是想以一种更为简洁的形式来重述它,并用最少的例子来说明这种行为。
我想添加的一件事是转义处理从左到右移动,因此\n首先找到反斜杠,然后寻找要转义的字符,然后找到n并转义它。\\n找到第一个反斜杠,找到第二个反斜杠并将其转义,然后找到n并将其视为文字n;\?查找反斜杠并查找要转义的字符,查找?无法转义\的字符,因此将其视为文字反斜杠。
正如mhawke所指出的,这里的关键是交互式解释器在显示字符串时转义反斜杠。我猜这是为了确保从解释器复制到代码编辑器的文本字符串是有效的python字符串。然而,在这种情况下,为方便起见,这种余地引起了混乱。
>>> 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
\\?