7

python 中“is”表达式的不稳定行为。

>>> 258 -1 is 257
False

>>> 258 -1 == 257
True
  1. python如何评估“is”表达式?为什么它显示为假,即使它是真的?

  2. 为什么它只发生在某些数字上?

    2 - 1 是 1 真

工作得很好。

4

4 回答 4

6

is用于身份检查,检查两个变量是否指向同一个对象,而==用于检查值。

文档

对象身份的运算符is和测试:当且仅 当 x 和 y 是同一个对象。产生逆真值。is notx is ytruex is not y

>>> id(1000-1) == id(999)
False

""" What is id?
id(object) -> integer
Return the identity of an object. This is guaranteed to be unique among
simultaneously existing objects. (Hint: it's the object's memory address.)
"""

>>> 1000-1 is 999
False
>>> 1000-1 == 999
True
>>> x = [1]
>>> y = x    #now y and x both point to the same object
>>> y is x
True
>>> id(y) == id(x)
True
>>> x = [1]
>>> y = [1]
>>> x == y
True
>>> x is y
False
>>> id(x),id(y)       #different IDs
(161420364, 161420012) 

但是一些小整数(-5 到 256)和小字符串被 Python 缓存:Why (0-6) is -6 = False?

#small strings
>>> x = "foo"
>>> y = "foo"
>>> x is y
True
>>> x == y
True
#huge string
>>> x = "foo"*1000
>>> y = "foo"*1000
>>> x is y
False
>>> x==y
True
于 2013-05-17T18:47:53.690 回答
2

isTrue仅当双方都是同一个对象时才比较对象身份并产生。出于性能原因,Python 维护一个小整数的“缓存”并重用它们,因此所有int(1)对象都是同一个对象。在 CPython 中,缓存的整数范围从 -5 到 255,但这是一个实现细节,所以你不应该依赖它。如果要比较相等性,请使用==,而不是is

于 2013-05-17T18:47:02.983 回答
2

is操作员检查对象身份:调用创建的对象与创建的对象258-1不同257==运算符检查比较对象的值是否相同。

尝试使用help('is').

于 2013-05-17T18:47:58.350 回答
1

Pythonis运算符检查对象标识,而不是对象值。这两个整数必须在内部引用相同的实际对象,is 才能返回 true。

由于 Python 维护的内部缓存,这将为“小”整数返回 true,但如果与is一般情况相比,具有相同值的两个数字将不会返回 true。

于 2013-05-17T18:47:25.177 回答