python如何评估“is”表达式? [复制]

Posted

技术标签:

【中文标题】python如何评估“is”表达式? [复制]【英文标题】:How does python evaluate "is" expressions? [duplicate] 【发布时间】:2013-05-13 00:38:08 【问题描述】:

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

>>> 258 -1 is 257
False

>>> 258 -1 == 257
True

    python 如何评估“is”表达式?为什么它显示为假,即使它是真的?

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

    2 - 1 是 1 是的

工作得很好。

【问题讨论】:

>>>2-1 is 1 返回True 哈哈 @carlosdc 它不完全是重复的。因为它适用于其他数字。这就是我问的原因。 @Rahul 在您的问题中明确说明。 正如阿什维尼指出的那样。这个问题:***.com/questions/11476190/why-0-6-is-6-false 更接近我的问题。 【参考方案1】:

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) 

但是一些小整数(-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

【讨论】:

【参考方案2】:

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

【讨论】:

您也可以在字符串中发生这种情况,因为字符串文字被缓存到一定大小。像foo = "foo"; foo is foo.strip() 这样的东西也可以返回True【参考方案3】:

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

尝试使用help('is')

【讨论】:

那为什么 2-1 is 1 返回 True 呢? @Rahul python 缓存一些小整数和小字符串,见:***.com/questions/11476190/why-0-6-is-6-false 在这里回答:***.com/a/16615952/2237320【参考方案4】:

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

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

【讨论】:

以上是关于python如何评估“is”表达式? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Python:为啥 ("hello" is "hello") 评估为 True? [复制]

Enumerable.AsEnumerable<>() 是不是强制评估表达式? [复制]

如何使用逻辑运算符评估前缀表达式

这个斐波那契 Lambda 函数是如何工作的? [复制]

Python和Javascript在评估正则表达式方面的区别

编写python代码,仅打印给定列表中评估为True的表达式[关闭]