gpt4 book ai didi

python - 默认初始值设定项指向对象的所有实例的相同数据?

转载 作者:行者123 更新时间:2023-11-30 23:27:31 28 4
gpt4 key购买 nike

几天前,我遇到了一个与此问题相关的令人讨厌的错误:当我的类的构造函数有一个空字典的默认参数时,该类的所有实例都指向同一个字典。这是一个例子:

class A:
def __init__(self, d={}):
self.D = d

class B:
def __init__(self):
self.D = {}

a1 = A()
a2 = A()
b1 = B()
b2 = B()

a1.D.update({'Akey':'Avalue'})
print("Printing a1 dict: ", a1.D)
print("Printing a2 dict: ", a2.D)

b1.D.update({'Bkey':'Bvalue'})
print("Printing b1 dict: ", b1.D)
print("Printing b2 dict: ", b2.D)

输出:

Printing a1 dict:  {'Akey': 'Avalue'}
Printing a2 dict: {'Akey': 'Avalue'}
Printing b1 dict: {'Bkey': 'Bvalue'}
Printing b2 dict: {}

我怀疑当字典在构造函数内初始化时(如在类 B 中),它会为每个对象创建一个新的引用。当字典初始化为默认对象时,即使初始化为空字典,所有对象都指向同一个字典。

有人可以阐明这种行为并更多地解释其内部运作原理吗?

谢谢

最佳答案

来自Python Language Reference

Default parameter values are evaluated when the function definition is executed. This means that the expression is evaluated once, when the function is defined, and that the same “pre-computed” value is used for each call.

定义函数时,会创建一个空字典,并将其绑定(bind)到函数对象。赋值语句

self.D = d

分配成员变量指向定义函数时创建的实例。修改该字典将会修改绑定(bind)的实例作为默认值。

可能实现您目标的替代定义如下:

def __init__(self, d=None):
if d is None:
self.D = {}
else:
self.D = d

关于python - 默认初始值设定项指向对象的所有实例的相同数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22032315/

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