gpt4 book ai didi

python - 为什么 is(AN()) == ideA()) 不同于 A() is A()?

转载 作者:太空狗 更新时间:2023-10-29 22:19:17 24 4
gpt4 key购买 nike

我对下面的 python 代码很困惑:

>>> class A(): pass  
...
>>> id(A()) == id(A())
True
>>> id(A())
19873304
>>> id(A())
19873304
>>> A() is A()
False
>>> a = A()
>>> b = A()
>>> id (a) == id (b)
False
>>> a is b
False
>>> id (a)
19873304
>>> id (b)
20333272
>>> def f():
... print id(A())
... print id(A())
...
>>> f()
20333312
20333312

我可以清楚地告诉自己 python 在创建对象时在做什么。
谁能告诉我更多关于发生的事情?谢谢!

最佳答案

当你说

print id(A()) == id(A())

您正在创建一个 A 类型的对象并将其传递给 id 函数。当函数返回时,没有对为参数创建的对象的引用。因此,引用计数变为零,并准备好进行垃圾回收。

当您再次在同一个表达式中执行 id(A()) 时,您正在尝试创建另一个相同类型的对象。现在,Python 可能会尝试重用用于先前创建的对象的相同内存位置(如果它已经被垃圾收集)。否则它将在不同的位置创建它。因此,id 可能相同也可能不同。

如果你接受,

print A() is A()

我们创建了一个 A 类型的对象,并试图将它与另一个 A 类型的对象进行比较。现在这个表达式中仍然引用了第一个对象。因此,它不会标记为垃圾回收,因此引用总是不同的。

建议:永远不要在生产代码中做这样的事情。

引自docs ,

Due to automatic garbage-collection, free lists, and the dynamic nature of descriptors, you may notice seemingly unusual behaviour in certain uses of the is operator, like those involving comparisons between instance methods, or constants. Check their documentation for more info.

关于python - 为什么 is(AN()) == ideA()) 不同于 A() is A()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21744802/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com