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)
因为a和b指向相同的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运算符来检查是否相等.
在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)