【发布时间】:2021-07-14 17:49:53
【问题描述】:
这是一个基本问题,可以说明如何更新类字段。我遇到了以下情况:
class MyClass():
def __init__(self):
self.a=0
self.my_dict={'a':self.a}
c=MyClass()
print('c.a=', c.a)
print('c.my_dict[\'a\']=', c.my_dict['a'])
c.my_dict['a']=1
print('c.a=', c.a)
print('c.my_dict[\'a\']=', c.my_dict['a'])
结果:
c.a= 0
c.my_dict['a']= 0
c.a= 0
c.my_dict['a']= 1
c.a 具有相同的值。为什么? c.a 不应该引用与 c.my_dict['a'] 相同的内存位置吗?
【问题讨论】:
-
MyClass.a和MyClass.my_dict是完全独立的。对一个的更改不会影响另一个。混淆的根源是您在my_dict(在__init__()中)的字典文字初始化程序中使用了实例的属性a。但是,在此语句中使用变量名称不会将此字典条目的值绑定到内存中的该属性位置。相反,它所做的只是评估属性a的值(在那一行,它是0),并使用该值来初始化my_dict["a"]。 -
谢谢。为什么这是一个副本并且没有引用相同的内存位置?
-
为什么会这样?
MyClass.a是一个包含值的变量,为什么在表达式中评估该变量除了评估其值之外会做任何事情?我更新了上面的评论,也许它回答了你的问题。 -
再次感谢@zr0gravity7
-
@Mihai.Mehe 没有复制。完全没有。
标签: python class dictionary field memory-address