【问题标题】:"is" and "id" in Python 3.5 [duplicate]Python 3.5中的“is”和“id” [重复]
【发布时间】:2016-03-16 03:59:37
【问题描述】:

我有问题: 我用的是python 3.5,win7-32​​bit系统。

这是我的代码:

a=3
b=3
print(id(a))
print(id(b))

它返回:

1678268160
1678268160

所以我们可以知道 a 和 b 引用同一个对象。

但问题来了:

a=3
b=3
print( id(a) is id(b) )

返回:

False

我不明白为什么会这样,我认为应该是真的。 谁能给我解释一下? 谢谢!

【问题讨论】:

  • 您可以将问题简化为print( id(a) is id(a) )

标签: python python-3.5


【解决方案1】:

id 返回一个 Python int 对象(你是 id-ing 的对象的内存地址,尽管这是一个实现细节)。但除了非常小的ints(同样,实现细节)之外,Python 中没有int 缓存;如果您以两种方式计算相同的int,则恰好有两个不同的int 对象具有相同的值。同样,每次调用 id 时都会创建一个新的 int,即使对象相同。

idis 的等价物是 a is b 意味着 id(a) == id(b),而不是 id(a) is id(b)(事实上,由于 ids 是大数,id(a) is id(b) 几乎总是 False )。

另请注意,您的测试用例在其他方面存在缺陷:

a = 3
b = 3
a is b

只为is 比较返回True,因为CPython 中的int 缓存很小;如果你完成了:

a = 1000
b = 1000
a is b

a is b 将是 False;您对身份的假设仅在 CPython 中适用于 -5 到 256(含)范围内的数字,出于性能原因,这些数字是单例,但所有其他 ints 会根据需要重新创建,而不是单例。

【讨论】:

  • 哇,我已经测试了你的解释,它有效!
【解决方案2】:

id(a) is id(b)比较id函数返回的id的id

id(a) == id(b) 将是 True,因为 a is b 并且在对象的生命周期内,id 返回的值将始终相同。但是,每次调用 id 时,都会返回一个不同的整数(具有相同的值),因此 id(a) is id(b)False

【讨论】:

    猜你喜欢
    • 2019-07-30
    • 2020-08-20
    • 1970-01-01
    • 2014-01-27
    • 2016-11-15
    • 1970-01-01
    • 2019-09-30
    • 2015-12-27
    相关资源
    最近更新 更多