gpt4 book ai didi

Python __init__ 从无处寻找变量

转载 作者:行者123 更新时间:2023-12-01 04:42:36 25 4
gpt4 key购买 nike

我真的很难理解这种行为是如何出现的。我已将其简化为尽可能小的示例,但仍然会产生不良效果。

  • 我初始化一个类的实例,其启动器指定如果未传递可选参数,则它应该是一个空列表。
  • 然后,我通过类上的方法添加一些数据,该方法应充当实例方法。
  • 我创建了同一个类的新实例,同样没有将变量传递给启动器,但这次变量就像魔术一样被填充。

代码:

class Demo:
def __init__(self, x=[]):
self._x = x
print x

def add_x(self, data):
self._x.append(data)

for x in range(0, 5):
obj = Demo()
obj.add_x([1, 2])

输出:

[]
[[1, 2]]
[[1, 2], [1, 2]]
[[1, 2], [1, 2], [1, 2]]
[[1, 2], [1, 2], [1, 2], [1, 2]]

我错过了什么?

最佳答案

def __init__(self, x=[]):
self._x = x

在这种情况下,每当您不带参数初始化类的实例时,self._x 将引用同一对象,而不是为每个实例创建一个新的空列表。实际上,self._x.append 正在附加到同一列表。

推荐的方法是

def __init__(self, x=None):
if x is None:
# create a new list
x = []
self._x = x

这适用于所有可变对象(例如 dictset...)。

关于Python __init__ 从无处寻找变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30236797/

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