我正在尝试运行循环,我一次又一次地使用相同的列表。但是每次执行都会修改列表。那么如何在每次运行中为同一个变量分配一个列表。
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。有什么建议吗?
答案 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
)现在可以满足您的需求。