为什么子类的浮点变量与父类的浮点变量是相同的内存地址?

Why is the floating-point variable of the subclass the same memory address as the floating-point variable of the parent class?

提问人:jaried 提问时间:8/18/2022 最后编辑:jaried 更新时间:8/18/2022 访问量:32

问:

如代码所示,建立了一个父类,该父类具有一个变量 ,并且子类继承了具有变量 的父类。结果,和的地址是一样的,为什么会这样?ClassAvar1ClassBvar2var1var2

因此,无论我给 或 赋值,两者的值都是相同的。这是什么原因?var1var2

我的代码如下:

class ClassA:
    def __init__(self):
        self.var1: float = 0


class ClassB(ClassA):
    def __init__(self):
        super(ClassB, self).__init__()
        self.var2: float = 0
        print(id(self.var1) == id(self.var2))


a = ClassB()

我得到的结果:

True

我的预期结果:

False

尝试了很多次,只有这样才能实现我的目标:

class ClassA:
    def __init__(self):
        self.var1: float = float('nan')


class ClassB(ClassA):
    def __init__(self):
        super(ClassB, self).__init__()
        self.var2: float = float('nan')
        print(id(self.var1) == id(self.var2))


a = ClassB()

False
Python

评论


答:

1赞 Xiidref 8/18/2022 #1

这是由于 python 如何处理内存,对于某些不可变类型,例如整数或字符串,有一些值是“通用”的并由 python 缓存,然后当您尝试使用相同的值时,在其他地方使用缓存值使其成为相同的地址。

是 python 缓存的整数值的一部分,因此在您的情况下,地址是相同的。0

是的,即使您将值声明为浮点数,您的值也是一个整数,唯一要做的就是检查值是否与浮点数匹配,而 0 是否与浮点数匹配,即使它是整数。

您可以通过以下方式验证这一点

>>> a:float = 0
>>> a
0
>>> type(a)
<class 'int'>
>>>
>>> b:float = 0.0
>>> b
0.0
>>> type(b)
<class 'float'>
>>>

有关更多详细信息,我建议您查看此答案