我有一个这样的课程
class Tree:
# class attributes:
a = []
b = None
def __init__(self, b, a_list):
self.b = b
if a_list is not None:
initialize_a_list(a_list)
def initialize_a_list(self, a_list):
self.a.append(a_list)当我打这个电话的时候tree = Tree(b, None)。我的树对象的a属性不是用一个空列表初始化的,而是用一个随机的非空列表初始化的。在此之前,我已经创建了一些类型为Trees的其他对象,并且我注意到tree的a中的一些元素具有与先前创建的那些对象的a相同的元素。
我将__init__函数中的a = []添加到代码中以解决此问题,但我想知道为什么会出现这种情况。为什么a是用这样的可能不是那么随机但不是空的列表来初始化的。
发布于 2021-11-29 04:43:54
实例变量不应该像这样声明:
class Tree:
# class attributes:
a = []
b = None将这些代码行移到__init__构造函数方法中,它就可以工作了。
发布于 2021-11-29 07:29:33
在此之前,我已经创建了
类型的其他对象,并且我注意到树的
a中的一些元素具有与先前创建的那些对象的a相同的元素。
这是因为您已将a变量声明为类变量。这意味着它由类的所有实例以及类本身共享。
在__init__方法中初始化a变量会使其成为实例变量,这意味着它由类的每个实例单独拥有(每个实例分配一个单独的数据结构并由每个实例处理)。
最后,值得注意的是,a确实被初始化为一个空列表,只是其他Tree实例写入了该共享列表,导致它看起来像是保存了随机数据。
https://stackoverflow.com/questions/70149776
复制相似问题