为什么循环浏览列表不识别的列表是列表是副本



我在循环列表列表时遇到了(我认为)非常奇怪的行为。很难解释,但这是一个示例代码:

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

我们有一个指向列表的指针,在循环中,我们有另一个指针指向内整数。区别在于,在这种情况下,指针将更改为指向零对象而不是列表元素。

最新更新