Can(s是"")和(s =="")在Python 2.6.2中会给出不同的结果吗?

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中轻松改变.


Joh*_*hin 7

你不应该在乎.与None定义为单例的不同,没有规则说只有一个空字符串对象.所以结果s is ""是依赖于实现,并且使用isNO-NO是否可以找到一个例子.