我有以下内容:
class Trade:
def __init__(self):
entry = [0, 1, 2, 3]
exit = [1, 2, 3, 4]
met = [0, 0, 0, 0]
self.stats = zip(entry, exit, met)
t = Trade()
for entry, exit, met in t.stats:
met = 1
for entry, exit, met in t.stats:
print(entry, exit, met)
我期待met
的所有值都是1.但事实并非如此。这是什么原因,我怎样才能使met
的修改反映在Trade class t
的实例中。 for语句是否生成t.stats的副本而不是遍历其原始副本?
答案 0 :(得分:6)
循环遍历列表的值时,会将值分配给局部变量。更改这些局部变量不会更改列表中存储的原始值。
使用enumerate()
调用添加索引,然后使用该索引更改原始列表:
for i, (entry, exit, met) in enumerate(t.stats):
t.stats[i] = (entry, exit, 1)
答案 1 :(得分:2)
以下将会这样做:
t.stats[:] = [(entry, exit, 1) for entry, exit, met in t.stats]
您的代码不起作用的原因是met = 1
只是将met
重新绑定到其他位置。这对t.stats
没有影响。