Python 函数取消引用指针,但仍会更改原始列表



最近几天我一直在玩python,但一直遇到一个奇怪的问题。(作为参考,我正在研究欧拉345项目。所以。。。我正在尝试将 2D 数组的一行和一列归零,但不是它们相交的点。现在,我知道可能有一种更pythonic的方法来解决这个问题,但我主要关心为什么我这里的代码不起作用。

def choose(initial_grid,row,col):
  """Return a grid with a given row and column zeroed except where intersect.
  """
  grid = list(initial_grid)                 #FLAG 1
  Special_value = grid[row][col] 
  grid[row] = [0]*len(grid[row]) 
  for i in xrange(len(grid)):
    grid[i][col] = 0
  grid[row][col] = Special_value
  return grid
qwer = [[ 1, 2, 3, 4],
        [ 5, 6, 7, 8],
        [ 9,10,11,12],
        [13,14,15,16]]
print choose(qwer,1,1)
print qwer

无论如何,我希望函数输出是

[[1, 0, 3, 4], [0, 6, 0, 0], [9, 0, 11, 12], [13, 0, 15, 16]]
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]

但。。。其实不然。无论出于何种原因,qwer都会清除其第 1 列。我尝试执行列表复制以取消引用initial_grid,传递的指针,并且尝试使用grid = initial_grid[:],但似乎没有任何效果。

那么怎么了呢?我该如何解决这个问题?为什么这是错误的?

list(initial_grid)会创建列表的浅拷贝。不会复制内部列表。

演示:

>>> l = [[1, 2], [0, 0]]
>>> c = list(l)
>>> l is c
False
>>> all(x is y for x,y in zip(l, c))
True
>>> c[0][0] = 5
>>> c
[[5, 2], [0, 0]]
>>> l
[[5, 2], [0, 0]]

如果需要深层副本,请使用 copy.deepcopy 。或者对于 2D 列表,请写入

>>> d = [sub[:] for sub in l]
>>> d[0][0] = 7
>>> d
[[7, 2], [0, 0]]
>>> l
[[5, 2], [0, 0]]

此外,您的术语已关闭。我们在 Python 中没有指针。我们有名称和值。

相关内容

最新更新