[英]Original list changes despite using independent copies
我想遍历矩阵的所有元素(在我的代码中为列表的列表),并在检查的元素满足特定条件时每次都创建该矩阵的独立副本。
每次创建副本时,我都想更改复制的矩阵中的一个元素(以便原始矩阵保持不变)。 矩阵的每个副本都应有一个单独的名称。
之后,我想将复制的矩阵存储在列表中。
因此,例如:考虑原始Matrix是一个2x2 Matrix,包含四个整数(假设数字1到4,如下面的代码所示)。 现在,让我们遍历矩阵元素,并在每次检查元素大于3时创建矩阵的副本。因此,我们应该获得一个副本(因为只有一个元素,数字4大于3)。 在此复制的矩阵中,我更改了元素之一(例如,将数字10添加到所检查的元素中)。 然后,我将复制的矩阵存储在列表中。 我的代码如下所示:
matrix = [[1,2],[3,4]]
new_copies = []
counter = 0
for i in range(0,2):
for k in range(0,2):
if matrix[i][k] > 3:
exec("item%s = matrix[:]" % counter)
exec("item%s[i][k] = matrix[i][k] + 10" % counter)
exec("new_copies.append(item%s)" % counter)
counter += 1
print(matrix)
print(new_copies)
如果运行此代码,您将看到复制的矩阵已正确更改,并且也存储在列表中。
但是原来的矩阵也改变了。 为什么? 我只操作矩阵的复制版本,该复制版本应与原始版本无关,因为我遵循以下原则:
new_matrix = original_matrix[:]
列表是可变对象,这就是为什么即使您通过执行matrix[:]
创建新的列表对象,您的子列表仍然指向相同的对象...
这是第一个解决方法:
matrix = [[1, 2], [3, 4]]
new_copies = []
counter = 0
for i in range(0, 2):
sublist = matrix[i][:]
for k in range(0, 2):
if matrix[i][k] > 3:
sublist[k] += 10
counter += 1
new_copies.append(sublist)
print(matrix)
print(new_copies)
如果可能,您还可以使用list comprehension ,在这种情况下,将是:
new_copies = [[(e + 10 if e > 3 else e) for e in l] for l in matrix]
这将给您与我以前的主张相同的结果
一个不错的解决方案是使用元组而不是列表,因为它们是不可变的对象。 但是如果您必须在程序中修改矩阵,那将是不可能的。
您还可以使用复制库中的deepcopy方法...
我必须提醒,如果可能,应避免使用eval
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.