我不知道这里出了什么问题,我确定这里有人可以帮忙。我有一个列表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