我想列出一个操作列表(每个操作都由一个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。
我或多或少理解为什么,但我不知道如何得到我期望的行为。
答案 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