Python 函数取消引用指针但仍会更改原始列表
Python function dereferences a pointer but still alters the original list
过去几天我一直在研究 python,但我一直遇到一个奇怪的问题。 (作为参考,我正在研究 euler 的 345 项目。)
所以......我试图将二维数组的一行和一列归零,但不是它们相交的点。现在,我知道可能有更 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
。或者对于二维列表,写
>>> d = [sub[:] for sub in l]
>>> d[0][0] = 7
>>> d
[[7, 2], [0, 0]]
>>> l
[[5, 2], [0, 0]]
另外,你的行话不对。 Python 中没有指针。我们有名字和价值观。
过去几天我一直在研究 python,但我一直遇到一个奇怪的问题。 (作为参考,我正在研究 euler 的 345 项目。) 所以......我试图将二维数组的一行和一列归零,但不是它们相交的点。现在,我知道可能有更 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
。或者对于二维列表,写
>>> d = [sub[:] for sub in l]
>>> d[0][0] = 7
>>> d
[[7, 2], [0, 0]]
>>> l
[[5, 2], [0, 0]]
另外,你的行话不对。 Python 中没有指针。我们有名字和价值观。