2011-12-02 90 views
3

我不知道这里出了什么问题,我确定这里有人可以帮忙。我有一个列表mylst(列表清单)被复制并传入方法foofoo迭代整个列表并使用传入的var替换行中的第一个元素并返回已更改的列表。我打印清单,我发现它给了我所期望的。我再次用mylst的另一个副本和另一个传入的变量重复该过程。所以这两个返回的列表应该是不同的;但是当我再次查看第一个列表时,我发现它现在是第二个列表,mylst已经更改为第二个列表。我没有正确复制清单吗?我用mylst[:]方法复制它。另一个有趣的观察是,所有的列表ID是不同的。这不是说这是一个不同于其他列表的列表吗?这是我的问题的一个例子。Python复制列表问题

def printer(lst): 
    print "--------------" 
    for x in lst: 
     print x 
    print "--------------\n" 

def foo(lst, string): 

    for x in lst: 
     x[0] = string 

    print "in foo" 
    for x in lst: 
     print x 
    print "in foo\n" 

    return lst 

mylst = [[1, 2, 3], [4, 5, 6]] 
print "mylst", id(mylst), "\n" 

first = foo(mylst[:], "first") 
print "first", id(first) 
printer(first) # Correct 

second = foo(mylst[:], "second") 
print "second", id(second) 
printer(second) # Correct 

print "first", id(first) 
printer(first) # Wrong 

print "mylst", id(mylst) 
printer(mylst) # Wrong 

这里的打印出我的电脑

mylst 3076930092 

in foo 
['first', 2, 3] 
['first', 5, 6] 
in foo 

first 3076930060 
-------------- 
['first', 2, 3] 
['first', 5, 6] 
-------------- 

in foo 
['second', 2, 3] 
['second', 5, 6] 
in foo 

second 3076929996 
-------------- 
['second', 2, 3] 
['second', 5, 6] 
-------------- 

first 3076930060 
-------------- 
['second', 2, 3] 
['second', 5, 6] 
-------------- 

mylst 3076930092 
-------------- 
['second', 2, 3] 
['second', 5, 6] 
-------------- 

回答

7

lst[:]伎俩使得一个级列表的副本上。你有嵌套列表,所以你可能想看看copy标准模块提供的服务。

特别是:

first = foo(copy.deepcopy(mylst), "first") 
+0

你知道为什么ID是不同的吗? – Jeff

+0

* first *列表的ID是不同的,但是您会发现*第一个列表中包含的列表*的ID是相同的。 –

+0

'deepcopy'总是有魔力,我在这些场景中几乎是盲目地使用它 – juliomalegria

0

你最好不要让MYLIST的另一个副本。这两次你调用foo,你都传递了相同的对象引用并修改了相同的列表。