Python 在类实例之间共享列表的正确方法是什么?

Python 在类实例之间共享列表的正确方法是什么?,python,class,Python,Class,我有这个示例代码 my_list = ["a","b","c","d"] class A: def __repr__(self): return ', '.join(my_list) def add(self, num): my_list.append(num) class_list = [] for x in range(5): class_list.append(A()) class_list[x].add("clas

我有这个示例代码

my_list = ["a","b","c","d"]

class A:
    def __repr__(self):
        return ', '.join(my_list)

    def add(self, num):
        my_list.append(num)



class_list = []
for x in range(5):
    class_list.append(A())
    class_list[x].add("class_%s" % (x))
    print class_list[x]
我的非示例代码更复杂,但我的想法是,我有多个类的实例在做一件事。全局my_列表用于所有实例。当类中满足某些逻辑时,该实例将修改列表。其余的类也将利用该列表来执行它们的逻辑。任何实例都可以添加到列表中,所有实例都应该能够利用更新后的值

现在在这个例子中,my_列表是共享的,但是这是正确的方法吗

类属性通常比全局属性好,因为它们只是彼此共享,而不是与世界上的每个人共享

为此,将my_list=[a,b,c,d]行移动到类a:,并将对my_list的每个引用更改为self.my_list或a.my_list:

但是,实例属性通常更好。如果将同一个列表分配给一组不同的变量,它仍然只是一个列表;更改它会影响所有这些变量。所以,你可以这样做:

class A(object):
    def __init__(self, shared_list):
        self.shared_list = shared_list
    def add(self, num):
        self.shared_list.append(num)
现在由使用A对象的代码决定是否给它们所有相同的列表。您甚至可以创建20个共享一个列表的实例,以及10个共享另一个列表的实例:

list1 = []
group1 = [A(list1) for _ in range(20)
list2 = []
group2 = [A(list2) for _ in range(10)
问题是调用方、类或任何人是否应该决定列表的共享程度。对于不同的应用程序,答案是不同的,因此很难对一个名为A和my_list的抽象示例给出答案。

类属性通常比全局属性好,因为它们只是彼此共享,而不是与世界上的每个人共享

为此,将my_list=[a,b,c,d]行移动到类a:,并将对my_list的每个引用更改为self.my_list或a.my_list:

但是,实例属性通常更好。如果将同一个列表分配给一组不同的变量,它仍然只是一个列表;更改它会影响所有这些变量。所以,你可以这样做:

class A(object):
    def __init__(self, shared_list):
        self.shared_list = shared_list
    def add(self, num):
        self.shared_list.append(num)
现在由使用A对象的代码决定是否给它们所有相同的列表。您甚至可以创建20个共享一个列表的实例,以及10个共享另一个列表的实例:

list1 = []
group1 = [A(list1) for _ in range(20)
list2 = []
group2 = [A(list2) for _ in range(10)

问题是调用方、类或任何人是否应该决定列表的共享程度。对于不同的应用程序,答案是不同的,因此很难对一个名为A和my_list的抽象示例给出答案。

作为旁注:在Python 2.x中,始终使用类AOObject:,而不是类A:。否则,您将创建经典类,这些类有各种各样的怪癖和错误特性,其中一些非常接近您在这里要做的事情。为什么不将全局列表作为参数传递给每个实例呢?列表是通过引用传递的,因此每个实例都可以在不处理并发性的情况下读取和修改列表。否则,您将创建经典类,这些类有各种各样的怪癖和错误特性,其中一些非常接近您在这里要做的事情。为什么不将全局列表作为参数传递给每个实例呢?列表是通过引用传递的,因此每个实例都可以在不处理并发性的情况下读取和修改列表。今天的西方更快的枪:-@mgilson:当我在一个编辑编译调试周期超过一分钟的项目上工作时,就会发生这种情况,就像回到石器时代或其他时代一样。现在,我的年轻人会用一堆整夜批处理作业中出现编译错误的扇形纸打我。如果我使用第二个选项,这是否意味着如果我更新list1,所有的group1实例都可以访问新列表?@Python Noob:正如abarnert所说,如果将同一个列表分配给一组不同的变量,它仍然只是一个列表;更改它会影响所有这些变量。但是不要相信我们的话,你自己来测试一下吧今天西方的更快的枪:-@mgilson:当我在一个编辑-编译-调试周期超过一分钟的项目上工作时,就会发生这种情况,就像这是石器时代的事情一样。现在,我的年轻人会用一堆整夜批处理作业中出现编译错误的扇形纸打我。如果我使用第二个选项,这是否意味着如果我更新list1,所有的group1实例都可以访问新列表?@Python Noob:正如abarnert所说,如果将同一个列表分配给一组不同的变量,它仍然只是一个列表;更改它会影响所有这些变量。但是不要相信我们的话,你自己来测试一下吧