Python 作用域:我在函数中复制了一个列表对象并修改了副本,但原来的被更改了。为什么?

Python scoping: I copied a list object in a function and modified the duplicate, but the original is changed. Why?

我正在编写一个简单的动态规划算法来遍历 Python 中的矩阵。由于我对 Python 的作用域规则缺乏理解,我很难修复这个错误。

这是我的部分代码:

# a new null matrix.
footstep = []
for i in range(size):
    row = [0]*size
    footstep.append(row)

def min_val(m, n, footstep):
    # copy a new footstep 2D-matrix.
    fs = list(footstep)

    if ((m == 0) and (n == 0)):
        print "origin"
        return get_grid(0, 0)

    ......
    ......
    ......

    return (min(min_val(m-1, n, fs), min_val(m, n-1, fs)

print min_val(4, 4, footstep)
print footstep

在函数调用开始时,我复制了一个新的相同足迹列表。因此,我的期望是:全局范围内的足迹列表一定没有改变。

我应该如何修复我的代码?请帮忙

您通过添加旧列表的所有元素复制了列表。因此,虽然列表本身是新的,但其中的元素仍然指向相同的对象。

要解决此问题,请在复制期间为数组中的每个对象单独创建一个副本。

示例(伪代码):

你在哪里做的

footstep = []
for i in range(size):
    row = [0]*size
    footstep.append(row)

你需要做类似的事情

for each element in the old array
  create a copy of the old element
  you may need to implement some copy() method which makes a copy of your object
  add the copy to the new array

另请参阅此 link 了解浅拷贝与深拷贝的更多解释:What is the difference between a deep copy and a shallow copy?

你做的是浅拷贝,你需要的叫深拷贝。