将不同的对象状态添加到列表中

时间:2015-10-16 10:44:25

标签: python

我想列出一个操作列表(每个操作都由一个corersponding类描述),然后让我的runner类循环遍历它并根据一些规则执行它们。某些操作可能会多次出现在列表中,但参数不同。但是,每个操作都有一些内部数据,应该计算一次并重新用于以后的调用。

我的想法是只创建一次操作,然后只修改不同的属性。但是这不起作用。

我的测试代码:

class my_op_class(object):
    def __init__(self):
        self.data = 1

lst = list()
my_op = my_op_class()

my_op.param = 2
lst.append(my_op)

my_op.param = 3
lst.append(my_op)

for l in lst:
    print l.data, l.param

我期望输出如下:

1 2
1 3

那些擅长python的人会看到列表中的两个条目都有param = 3。

我或多或少理解为什么,但我不知道如何得到我期望的行为。

1 个答案:

答案 0 :(得分:1)

您的列表引用了同一对象的多个副本。该对象具有单个参数值,因此当您更改参数值时,它会在所有引用上更改它。

每次将其添加到列表中时,都需要创建一个新实例。您可以通过直接调用构造函数来实现:

class my_op_class(object):
    def __init__(self):
        self.data = 1

lst = list()

my_op = my_op_class()
my_op.param = 2
lst.append(my_op)

my_op = my_op_class()
my_op.param = 3
lst.append(my_op)

for l in lst:
    print l.data, l.param 

或者每次附加到列表时都可以使用copy.deepcopy创建新实例:

import copy

class my_op_class(object):
    def __init__(self):
        self.data = 1

lst = list()
my_op = my_op_class()

my_op.param = 2
lst.append(copy.deepcopy(my_op))

my_op.param = 3
lst.append(copy.deepcopy(my_op))

for l in lst:
    print l.data, l.param