'is' in Python
在Python中应该避免将“is”运算符用于比较 像“数值”和“字符串”这种不可变的值。由于Python内部操作这些对象的方式,使得对这些对象使用“is”运算符的结果将是不可预测的。
下面以两个例子加以说明:
# DEMO 1: x = y = [1, 2, 3] z = [1, 2, 3] print("'x == y' gets ", x == y) print("'x == z' gets ", x == z) print("'x is y' gets ", x is y) print("'x is z' gets ", x is z) # DEMO 2: a = b = 'hello' c = 'hello' print("'a == b' gets ", a == b) print("'a == c' gets ", a == c) print("'a is b' gets ", a is b) print("'a is c' gets ", a is c)
DEMO 1的结果没有问题:
'x == y' gets True 'x == z' gets True 'x is y' gets True 'x is z' gets False
对于DEMO 2的结果:
'a == b' gets True 'a == c' gets True 'a is b' gets True 'a is c' gets True
对于DEMO 2的结果,我们能够理解出现这一结果的原因('hello'是一个字符串常量并且不可改变的,当定义第二个
字符串常量时,由于其与第一个常量值相同,所以 Python不会再次申请一段空间用于存储这一字符串常量--因为这个字符
串常量不会改变,而是直接使用前面已经定义过的字符串常量;因此后来定义的c和先前定义的a,b其实都是同一对象)。
但是,这和我们使用is的本意可能并不一致,所以,在Python中应该避免将“is”运算符用于比较 像“数值”和“字符串”
这种不可变的值。