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



我正在编写一个简单的动态编程算法来遍历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

另请参阅此链接了解浅副本与深副本的更多解释:深副本和浅副本之间的区别是什么?

你所做的是一个肤浅的复制,你所需要的被称为深度复制。

最新更新