python如何评估“是”表达式?

时间:2013-05-17 18:44:40

标签: python

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

>>> 258 -1 is 257
False

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

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

      
        
          

    2 - 1是1           真

        
      
  3. 完美无缺。

4 个答案:

答案 0 :(得分:6)

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

来自docs

  

运营商isis not测试对象标识:x is ytrue   当且仅当x和y是同一个对象时。 x 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) 

但Python会缓存一些小整数(-5到256)和小字符串: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

答案 1 :(得分:2)

仅当双方都是同一个对象时,

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

答案 2 :(得分:2)

is运算符检查对象标识:通过调用258-1创建的对象与257创建的对象不同。 ==运算符检查比较对象的值是否相同。

尝试使用help('is')

答案 3 :(得分:1)

Python is operator检查对象标识,而非对象值。两个整数必须在内部引用相同的实际对象才能返回true。

由于Python维护内部缓存,这将对“小”整数返回true,但是如果与is进行比较,则两个具有相同值的数字将不会返回true。