2011-12-02 76 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,你都傳遞了相同的對象引用並修改了相同的列表。