更改变量将更改变量的副本

时间:2019-07-15 10:03:40

标签: python-3.x list

我要解决的问题是有关leetcode的问题(链接: https://leetcode.com/problems/rotting-oranges/) 当我尝试更改可变网格时,它会更改副本p。

我在堆栈溢出时查看了类似的问题,并尝试了所有无效的解决方案。我还尝试自己使用打印来解决问题。

import copy
class Solution:
    def orangesRotting(self, grid: List[List[int]]) -> int:
        if grid == []:
            return 0
        s = []
        t = 0
        while True:
            p = copy.copy(list(grid.copy()[:]))
            print(p, grid)
            for r, l in enumerate(grid):
                for c, v in enumerate(l):
                    if v == 2:
                        if c-1>=0 and grid[r][c-1] == 1:
                            s.append([r, c-1])
                        if c+1<len(l) and grid[r][c+1] == 1:
                            s.append([r, c+1])
                        if r-1>=0 and grid[r-1][c] == 1:
                            s.append([r-1, c])
                        if r+1<len(grid) and grid[r+1][c] == 1:
                            s.append([r+1, c])
            print(p, s)
            for i in s:
                grid[i[0]][i[1]] = 2
                print(p, i)
            print(p, grid)
            if p == grid:
                for i in grid:
                    for j in i:
                        if j == 1:
                            return -1
                return t
            print(t)
            t+=1
            s= []

在代码底部附近,当我更改变量网格时,变量p也被更改

1 个答案:

答案 0 :(得分:1)

如所记载,copy.copy()仅进行浅表复制-列表本身是不同的对象,但它们(至少最初)仍指向相同的对象。因此,如果这些对象是可变的,则通过两个列表确实可以看到对一个对象进行变异的结果。

这里想要的是copy.deepcopy(),它将递归地创建(深层)列表中所有对象的副本。