2013-01-23 120 views
1

压缩的名单我有以下几点:遍历在Python

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的副本而不是遍历其原始副本?

回答

5

当您遍历列表的值时,将值分配给局部变量。更改这些局部变量不会更改存储在列表中的原始值。

使用enumerate()呼叫添加索引,然后使用该索引来改变原来的列表:

for i, (entry, exit, met) in enumerate(t.stats): 
    t.stats[i] = (entry, exit, 1) 
+1

不起作用。 'zip'返回一个不可变的元组列表... – mgilson

+0

@mgilson:oops,已更正。 –

+0

哦,我明白了@mgilson的评论指的是什么?我无法修改t.stats? – Joshua

2

下面将做到这一点:

t.stats[:] = [(entry, exit, 1) for entry, exit, met in t.stats] 

的原因,你的代码不起作用是met = 1简单重新绑定met指向其他地方。这对t.stats没有影响。