有没有时候`is`运算符可以在Python中用两个相似的字符串返回false?

Seg*_*ult 2 python string comparison

我有一些代码,我是编辑,使其一目了然更容易理解,我想我应该改变所有的char=="|"char is "|".我知道看起来我太过分了,但看起来确实好看了.无论如何,我pycheck最后一次决定,我得到了这个警告:

Warnings...

test.py:7: Using is |, may not always work
Processing module test (test.py)...
Run Code Online (Sandbox Code Playgroud)

对于我的生活,我无法想象除非你开始冒险进行多字节字符编码,CJK字符等,如果我没有错,那么它"|" is "|"将会返回False.还有其他一些我错过的情况吗?

the*_*eye 12

==将检查两侧的值是否相等,但is将检查两个变量是否指向相同的参考.所以,它们都是出于完全不同的目的.例如,

a = "aa"
b = "aa"
print a, b, id(a), id(b)
print a == b
print a is b
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出

aa aa 140634964365520 140634964365520
True
True
Run Code Online (Sandbox Code Playgroud)

因为ab指向相同的String数据(字符串在Python中是不可变的),python优化使用相同的对象.这就是原因is,==两者都在回归True.在哪里

a = "aa"
b = "aaa"[:2]
print a, b, id(a), id(b)
print a == b
print a is b
Run Code Online (Sandbox Code Playgroud)

在我的机器上输出

aa aa 139680667038464 139680667014248
True
False
Run Code Online (Sandbox Code Playgroud)

虽然a并且b具有相同的数据(相等),但在存储器中它们存储在不同的位置(不同的引用或两个不同的对象).

所以,永远不要使用is运算符来检查是否相等.

  • 轻微的挑剔:内存存储位置或多或少无关紧要.相关的一点是它们是两个独立的对象. (2认同)
  • @Segfault,但这样做是不是有成本检查_every_时间有人将字符串切片几次它会匹配现有的字符串?仅仅因为有一个参考它并不意味着它也被实施. (2认同)

Joh*_*ooy 7

在CPython中,所有单个字符串都是实例化的,并且对于相同的字符串(字符)应始终具有相同的id

这只是一个实现细节,不应该依赖.

这里几个地方,你可能要检查两个字符串的身份是一样的,但是你的使用情况是不是其中之一

Python 2.7.2 (1.9+dfsg-1, Jun 19 2012, 23:23:45)
[PyPy 1.9.0 with GCC 4.7.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
And now for something completely different: ``"let's not be obscure, unless we
really need to"''
>>>> a = "|"
>>>> a is "|"
False
Run Code Online (Sandbox Code Playgroud)