Freewind @ Thoughtworks scala java javascript dart 工具 编程实践 月结 math python english [comments admin] [feed]

(2012-02-20) Python中的is

广告: 云梯:翻墙vpn (省10元) 土行孙:科研用户翻墙http proxy (有优惠)

话说发现一个奇怪的问题,我还以为找到了IDLE的bug,兴奋不已,原来是已经讨论过千百遍的问题。

事情是这样的。在IDLE下运行这段代码:

a = “aaa”
b = “aaa”
print a is b

True

print a == b

True

print “%s , %s” % (id(a), id(b))

43872224 , 43872224

都是True,挺正常的。但是一旦字符串里有了个空格:

x = “x x”
y = “x x”
print x is y

False

print x == y

True

print “%s , %s” % (id(x), id(y))

43872008 , 43872128

就变成False了。
把这些代码打到PyCharm里,却都是True,这是怎么回事呢?难道是IDLE的BUG?
经过在群里的讨论和stackoverflow上的提问与搜索,发现原来python只保证-5到256之间的整数,用is比较会返回true,其它情况下的行为没有规定。不同的编辑器可以有不同的实现,我们不能依赖它去判断,而应该用id(x)这个方法。
那我们应该什么时候使用is呢?在与python提供的内置对象进行比较时,可以用它,比如:

if a is None:

    pass</font>
更多讨论参考:

http://stackoverflow.com/questions/9361341/compare-two-same-strings-but-get-different-results-in-idle

comments powered by Disqus