将列表分配给循环中的变量

时间:2014-09-23 05:10:36

标签: python list python-2.7 for-loop

我正在尝试运行循环,我一次又一次地使用相同的列表。但是每次执行都会修改列表。那么如何在每次运行中为同一个变量分配一个列表。

import random

def fuse(a, row, col):
    a[row][col] = -a[row][col]
    return a

final_list = [[2,4],[5,6],[3,2],[1,0]]
for k in range(3):
    A = final_list[:]
    print A
    print final_list
    for i in range(len(A)-2):
        row = random.randint(0,len(A)-1)
        col = random.randint(1,len(A[row])-1)
        A = fuse(A,row,col)

在上面的代码中,A在每次运行中都会被修改。但是当我将final_list复制到A并打印A和final_list时,它们是不同的。我不明白。我想在A中完全复制final_list。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

您发布的代码实际上并未证明您的问题。事实上,它实际上无法运行(无论fuse做什么),因为A[row]始终是int,因此len(A[row])可以保证提升TypeError

但这很明显,在真正的代码中,final_list不是数字列表,而是2D列表 - 数字列表列表。

这意味着A = final_list[:]仅复制顶级列表。因此,您确实获得了一个新列表 - 但它是一个新列表,它引用与原始列表完全相同的行。因此,如果fuse改变其中一行,您仍然会改变原始final_list

您需要将final_list向下复制2个级别,而不仅仅是1级,如下所示:

A = [row[:] for row in final_list]

...或者只是深层复制它:

A = copy.deepcopy(final_list)

以下是一个实际运行的示例,并演示了您的问题:

import random

def fuse(a, row, col):
    a[row][col] = -a[row][col]
    return a

final_list = [[2,4],[5,6],[3,2],[1,0]]
for k in range(3):
    A = final_list[:]
    print A
    for i in range(len(A)-2):
        row = random.randint(0,len(A)-1)
        col = random.randint(1,len(A[row])-1)
        A = fuse(A,row,col)

A = final_list[:]更改为A = copy.deepcopy(final_list)(当然,添加import)现在可以满足您的需求。