Python 使用列表/可变属性初始化类

问题描述 投票:0回答:2

如果我想初始化一个具有列表属性的类,那么我可以直接将列表分配给类中的属性init

但是这样做只是列表引用的分配,如果我更新原始列表,我的类属性将会更改。

使用列表属性初始化 python 类的最佳方法是什么?我应该使用列表复制/深层复制,还是可以忽略上面的问题并仅仅依靠人们丢弃他们用于初始化的列表?

class A:
    def __init__(self, arr):
        self.arr = arr

arr = [1,2,3]
a = A(arr)
print(a.arr)
arr[0] = 100
print(a.arr)
python class initialization
2个回答
0
投票

没有最好的方法来初始化这样一个类,因为真正的答案是,它取决于你的类的目的,也许还取决于你会/可能在其中引发的副作用(当然不推荐:))。

因此,如果您想使用数组/列表,它们都是可变数据结构,我会在我的init复制/深度复制它们,只是为了确保没有任何事情发生超出范围您的班级,遵循 LEGB(本地、封闭、全局或内置范围约定)。

因此,正如您在帖子中提到的那样,我总是会复制输入,以确保类范围之外不会发生任何事情。祝你好运:)


0
投票

您可以简单地将默认参数作为元组传递,然后根据需要将其转换为

__init__
函数中的列表。

>>> class A:
...     def __init__(self, arr=(1, 2, 3)):
...         self.arr = list(arr)
... 
>>> a = A()
>>> b = A()
>>> print(a.arr)
[1, 2, 3]
>>> print(b.arr)
[1, 2, 3]
>>> a.arr[0] = 100
>>> print(a.arr)
[100, 2, 3]
>>> print(b.arr)
[1, 2, 3]
© www.soinside.com 2019 - 2024. All rights reserved.