jch*_*chl 5 python string identity equality
正如任何Python程序员所知,你应该使用==
而不是is
比较两个字符串的相等性.但是,是否有任何实际情况( s is "" )
,并( s == "" )
会在Python 2.6.2给出不同的结果?
我最近遇到( s is "" )
了代码审查中使用的代码,虽然指出这是不正确的,但我想举例说明这可能会失败.但是尽可能地尝试,我不能构造两个具有不同身份的空字符串.似乎Python实现必须在许多常见操作中特殊情况下使用空字符串.例如:
>>> a = ""
>>> b = "abc"[ 2:2 ]
>>> c = ''.join( [] )
>>> d = re.match( '()', 'abc' ).group( 1 )
>>> e = a + b + c + d
>>> a is b is c is d is e
True
Run Code Online (Sandbox Code Playgroud)
然而,这个问题表明,有有情况( s is "" )
,并( s == "" )
可以是不同的.谁能举个例子?
zol*_*i2k 12
Python is
测试对象标识而不是相等.以下是使用is
和==
给出不同结果的示例:
>>> s=u""
>>> print s is ""
False
>>> print s==""
True
Run Code Online (Sandbox Code Playgroud)
Dun*_*can 11
正如其他人所说,不要依赖未定义的行为.但是,由于您要求Python 2.6的特定反例,这里是:
>>> s = u"\xff".encode('ascii', 'ignore')
>>> s
''
>>> id(s)
10667744
>>> id("")
10666064
>>> s == ""
True
>>> s is ""
False
>>> type(s) is type("")
True
Run Code Online (Sandbox Code Playgroud)
Python 2.6能够以空字符串结束的唯一一次,它不是正常的空字符串,当它执行字符串操作时,它不确定字符串将持续多长时间.因此,当您对字符串进行编码时,错误处理程序最终可以剥离字符并在完成后修复缓冲区大小.当然这是一个疏忽,可以在Python 2.7中轻松改变.