a == b 为假,但 id(a) == id(b) 为真?

发布于 2024-08-22 13:54:14 字数 448 浏览 6 评论 0原文

遇到以下问题:

>>> class A:
...     def __str__(self):
...             return "some A()"
... 
>>> class B(A):
...     def __str__(self):
...             return "some B()"
... 
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!

这是怎么回事?

Ran into the following:

>>> class A:
...     def __str__(self):
...             return "some A()"
... 
>>> class B(A):
...     def __str__(self):
...             return "some B()"
... 
>>> print A()
some A()
>>> print B()
some B()
>>> A.__str__ == B.__str__
False # seems reasonable, since each method is an object
>>> id(A.__str__)==id(B.__str__)
True # what?!

What's going on here?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

青瓷清茶倾城歌 2024-08-29 13:54:15

以下作品:

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False

The following works:

>>> id(A.__str__.im_func) == id(A.__str__.im_func)
True
>>> id(B.__str__.im_func) == id(A.__str__.im_func)
False
野生奥特曼 2024-08-29 13:54:15

对于我们这些被你的标题吸引的人来说,要确定方法是否被覆盖:

class A:
    def __str__(self):
        return "some A()"

    def strWasOverridden(self):
        return A.__str__ != self.__str__

For those of us here attracted by your title, to determine whether a method was overridden:

class A:
    def __str__(self):
        return "some A()"

    def strWasOverridden(self):
        return A.__str__ != self.__str__
请止步禁区 2024-08-29 13:54:14

当字符串 id(A.__str__) == id(B.__str__) 被求值时,A.__str__ 被创建,它的 id 被获取,然后被垃圾收集。然后创建了 B.__str__ ,并且恰好最终到达了 A.__str__ 之前所在的完全相同的地址,因此它(在 CPython 中)获得了相同的 id。

尝试将 A.__str__B.__str__ 分配给临时变量,您会看到不同的东西:

>>> f = A.__str__
>>> g = B.__str__
>>> id(f) == id(g)
False

有关此现象的更简单的示例,请尝试:

>>> id(float('3.0')) == id(float('4.0'))
True

As the string id(A.__str__) == id(B.__str__) is evaluated, A.__str__ is created, its id taken, and then garbage collected. Then B.__str__ is created, and happens to end up at the exact same address that A.__str__ was at earlier, so it gets (in CPython) the same id.

Try assigning A.__str__ and B.__str__ to temporary variables and you'll see something different:

>>> f = A.__str__
>>> g = B.__str__
>>> id(f) == id(g)
False

For a simpler example of this phenomenon, try:

>>> id(float('3.0')) == id(float('4.0'))
True
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文