我在循环列表列表时遇到了(我认为)非常奇怪的行为。很难解释,但这是一个示例代码:
k = [[0],[1],[2]]
for lis in k:
lis_copy = lis
lis_copy.append(0)
print lis
执行此功能时,我得到:
[0, 0]
[1, 0]
[2, 0]
这对我来说非常奇怪,因为附加的列表是lis的副本,但是LI也被附加了。我认为此列表未触及。例如,使用整数列表进行以下情况:
k = [0,1,2]
for num in k:
num_copy = num
num_copy = 0
print num
输出:
0
1
2
正如预期的那样,NUM_COPY的操作不会触摸NUM。
如果有人可以解释为什么会发生这种情况以及如何避免这种情况,就像如何从IS中断开lis_copy的连接一样,那将是很棒的。
哇,我很惊讶我以前没有遇到过市问题,但又不知道这一点。我想我应该审查安静的一些代码。无论如何,我认为这是某种程度上连接到循环的,似乎并非如此,因此我认为最好的解释可以在这里找到:
如何克隆或复制列表?
这是因为python列表(和dicts)未复制到新列表中,但是新列表成为对该列表的引用。如果您真的想复制列表,请使用DeepCopy
您可以使用copy.copy()
或copy.deepcopy()
避免此行为:
import copy
k = [[0],[1],[2]]
for lis in k:
lis_copy = copy.copy(lis)
lis_copy.append(0)
print lis
输出:
[0]
[1]
[2]
来源:https://docs.python.org/2/library/copy.html
案例A:
k = [[0],[1],[2]]
for lis in k:
lis_copy = lis
lis_copy.append(0)
print lis
我们有一个指向列表的指针,在循环中,我们有另一个指针指向内部列表对象。然后将零附加到每个对象上。
案例B:
k = [0,1,2]
for num in k:
num_copy = num
num_copy = 0
print num
我们有一个指向列表的指针,在循环中,我们有另一个指针指向内整数。区别在于,在这种情况下,指针将更改为指向零对象而不是列表元素。