Python如何评估“is”表达式?

7

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

>>> 258 -1 is 257
False

并且
>>> 258 -1 == 257
True
  1. Python如何评估“is”表达式?为什么它显示为false,即使它是true?

  2. 为什么只有一定范围的数字才会发生这种情况?

    2 - 1 is 1 True

完全正常工作。


">>>2-1 is 1" 返回 "True" 哈哈 - TehTris
@carlosdc 这并不完全是重复问题,因为它适用于其他数字。这就是我问的原因。 - Rahul
1
@Rahul,请在你的问题中明确说明。 - askewchan
正如Ashwini所指出的那样。这个问题:https://dev59.com/WGgu5IYBdhLWcg3wOUu- 更接近于我的问题。 - Rahul
4个回答

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

isis not这两个操作符用于测试对象的身份:x is y当且仅当x和y是同一对象时为truex 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)和小字符串:为什么(0-6)等于-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

2

is 是用来比较对象身份的,只有当两个对象是同一个对象时才返回 True。出于性能考虑,Python 维护了一个“缓存”小整数并重复使用它们,因此所有的 int(1) 对象都是同一个对象。在 CPython 中,缓存的整数范围为 -5 到 255,但这是一项实现细节,所以您不应该依赖它。如果您想要比较相等性,请使用 == 而不是 is


你也可以通过字符串来实现这种缓存效果,因为字符串字面量会被缓存到一定的大小。例如 foo = "foo"; foo is foo.strip() 也会返回 True - mgilson

2
is操作符用于检查对象的身份:通过调用258-1创建的对象与通过257创建的对象不是同一个对象。而==操作符则检查所比较的对象的值是否相同。
尝试使用help('is')

为什么 2-1 是 1 返回 True 呢? - Rahul
@Rahul Python缓存一些小整数和小字符串,参见:https://dev59.com/WGgu5IYBdhLWcg3wOUu- - Ashwini Chaudhary
已在此回答:https://dev59.com/d3LYa4cB1Zd3GeqPVT9e#16615952 - Alice

1

Python is operator检查的是对象的身份(identity),而不是对象的值。两个整数必须在内部引用同一个实际对象,才能返回true。

由于Python维护了一个内部缓存,因此对于“小”整数,这将返回true,但是如果使用is比较具有相同值的两个数字,则通常不会返回true。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接