我不知道這裏出了什麼問題,我確定這裏有人可以幫忙。我有一個列表mylst
(列表清單)被複制並傳入方法foo
。 foo
迭代整個列表並使用傳入的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]
--------------
你知道爲什麼ID是不同的嗎? – Jeff
* first *列表的ID是不同的,但是您會發現*第一個列表中包含的列表*的ID是相同的。 –
'deepcopy'總是有魔力,我在這些場景中幾乎是盲目地使用它 – juliomalegria