2014-09-11 56 views
1

我有这样的例子代码在类实例之间共享列表的正确方法是什么?

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_list用于所有实例。当某个类内部满足某个逻辑时,该实例将修改该列表。其余的课程将利用该列表来执行其逻辑。任何实例都可以添加到列表中,并且所有实例都应该能够使用更新后的值。

现在在这个例子中,my_list是共享的,但这是正确的方法吗?

+1

附注:总是在Python 2.x中始终使用'class A(object):',而不是'class A:'。否则,你正在创建经典类,它有各种各样的怪癖和错误特征,其中一些危险地接近你想要在这里做的事情。 – abarnert 2014-09-11 00:55:43

+0

为什么不将全局列表作为参数传递给每个实例'__init__'?列表按引用传递,因此每个实例都可以读取和修改列表(假设您没有处理并发)。 – MikeRand 2014-09-11 00:56:58

回答

4

一个类的属性是通常比全球更好,因为然后他们只是彼此分享,而不是与世界上的每个人分享。

为了做到这一点,移动my_list = ["a","b","c","d"]线下class A:,和每一个参考my_list改变self.my_listA.my_list

class A(object): 
    shared_list = [] 
    def add(self, num): 
     self.my_list.append(num) 

然而,实例属性是往往甚至更​​好。如果您将相同的列表分配给一堆不同的变量,它仍然只是一个列表;改变它会影响所有这些变量。所以,你可以做这样的事情:

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类,或者没有一个人是一个谁应该做出如何“共享”清单的决定。对于不同的应用程序,答案是不同的,所以很难给出一个像Amy_list这样的名称的抽象例子的答案。

+2

今天在西方的速度更快的枪:-) – mgilson 2014-09-11 00:56:25

+0

@mgilson:当我用一分钟的编辑 - 编译 - 调试周期来处理一个项目时,会发生这种情况,就像这次回到了石器时代之类的事情。 (现在我年轻的自己会用堆叠的折叠纸带着我在夜间批量工作中编译错误。) – abarnert 2014-09-11 01:00:52

+0

如果我使用第二个选项,是否意味着如果我更新'list1',所有'group1'实例有权访问新列表? – 2014-09-11 01:17:49

相关问题