给列表添加不同的物体状态

2024-10-03 17:14:53 发布

您现在位置: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。你知道吗

我或多或少明白为什么,但我不知道如何得到我期望的行为。你知道吗


Tags: 数据self列表data参数属性param规则
1条回答
网友
1楼 · 发布于 2024-10-03 17:14:53

您的列表正在引用同一对象的多个副本。对象只有一个param值,因此当您更改param值时,它会在所有引用上更改它。你知道吗

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

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

相关问题 更多 >