修改嵌套列表的副本会修改原始列表

时间:2018-10-23 12:48:23

标签: python list nested-lists

z=[2,3,4]
a=[[],[1,1,1],[1,1,1,1]]
learning_rate=0.3

def _update_iteration(z,a,learning_rate):
    a2=a
    print(a)
    print(a2)
    for q in range(1):
        for j in range(z[q+1]):
            a2[q+1][j]=a[q+1][j]-learning_rate
    print(a)
    print(a2)
    print('test')

_update_iteration(z,a,learning_rate)
_update_iteration(z,a,learning_rate)

如果您运行代码,即使我从未声明过类似a的内容,输出也会指出变量a=...已更改。

我该怎么办?

1 个答案:

答案 0 :(得分:0)

在python中,可变不可变类型之间存在区别。不可变的类型不能更改其内部状态(例如,整数没有内部状态,而是纯值)。但是,列表和其他对象可以更改其状态,因此是可变的。

将不可变类型的变量分配给新变量时,python内部保存内存,并让两个变量都指向内存中的相同位置/地址(因为变量背后的值/数据是不可变的,则没有理由在内存中保存它的另一个副本)

但是对于可变类型,这种指向内存中相同位置的简单技巧意味着您还可以更改数据的内部状态,并查看所有引用变量的更改。

为避免这种情况,您必须复制该内部数据,然后引用该副本。

要实现此目的,您必须更改以下行:

a2 = a

from copy import deepcopy

a2 = deepcopy(a)