无法在嵌套函数内的 python 中按值传递
Not able to do pass by value in python inside a nested function
我想将二维数组的新实例传递给函数。我已经尝试了常见的答案,比如使用列表(旧)或做一个旧的 [:]。我仍然得到相同的参考。
我能想到的唯一原因是使用嵌套方法,由于我的 C 背景,我不太了解这些方法。如果有人能解释为什么代码以这种方式运行,那将真正帮助我理解 python 的魔力。
复制代码(经过编辑以使其最小化并更具描述性)-
from pprint import pprint as pp
class Solution:
def solveNQueens(self, a):
b1 = [['.' for i in range(a)] for j in range(a)] #base list with queens positions and empty positions
b2 = list(b1) #to make a seperate list with na positions marked as x
def fillRows(i, j, b, p):
b[i][j] = 'Q' #add queens position
for x in range(i + 1, a):
p[x][j] = 'x' #cross straight entries
return b, p
def queenFill(i, b, p):
for j, e in enumerate(p[i]):
if e == '.':
pp(p)
bx = []
bx.extend(b) # trying to create new array duplicate that original array is unaffected by fillRows
# but as seen from print p is getting changed still, it should be same for every print call
px = []
px.extend(p)
bt, pt = fillRows(i, j, list(bx), list(px)) #trying to create new array duplicate using another method
queenFill(0, b1[:], b2[:]) #trying to create new array duplicate using another method
s = Solution()
s.solveNQueens(4)
我得到的输出是 -
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['Q', '.', '.', '.'],
['x', '.', '.', '.'],
['x', '.', '.', '.'],
['x', '.', '.', '.']]
[['Q', 'Q', '.', '.'],
['x', 'x', '.', '.'],
['x', 'x', '.', '.'],
['x', 'x', '.', '.']]
[['Q', 'Q', 'Q', '.'],
['x', 'x', 'x', '.'],
['x', 'x', 'x', '.'],
['x', 'x', 'x', '.']]
虽然它应该是这样的,因为我没有更改我在任何地方打印的变量,但我正在创建它的副本 -
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']],
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
b1
是包含内部 list
的 list
。复制它,使用 list(b1)
或 b1[:]
复制外部 list
,但不复制内部 list
s.
如果您也想复制内部列表,请尝试使用 copy.deepcopy
。
我想将二维数组的新实例传递给函数。我已经尝试了常见的答案,比如使用列表(旧)或做一个旧的 [:]。我仍然得到相同的参考。
我能想到的唯一原因是使用嵌套方法,由于我的 C 背景,我不太了解这些方法。如果有人能解释为什么代码以这种方式运行,那将真正帮助我理解 python 的魔力。
复制代码(经过编辑以使其最小化并更具描述性)-
from pprint import pprint as pp
class Solution:
def solveNQueens(self, a):
b1 = [['.' for i in range(a)] for j in range(a)] #base list with queens positions and empty positions
b2 = list(b1) #to make a seperate list with na positions marked as x
def fillRows(i, j, b, p):
b[i][j] = 'Q' #add queens position
for x in range(i + 1, a):
p[x][j] = 'x' #cross straight entries
return b, p
def queenFill(i, b, p):
for j, e in enumerate(p[i]):
if e == '.':
pp(p)
bx = []
bx.extend(b) # trying to create new array duplicate that original array is unaffected by fillRows
# but as seen from print p is getting changed still, it should be same for every print call
px = []
px.extend(p)
bt, pt = fillRows(i, j, list(bx), list(px)) #trying to create new array duplicate using another method
queenFill(0, b1[:], b2[:]) #trying to create new array duplicate using another method
s = Solution()
s.solveNQueens(4)
我得到的输出是 -
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['Q', '.', '.', '.'],
['x', '.', '.', '.'],
['x', '.', '.', '.'],
['x', '.', '.', '.']]
[['Q', 'Q', '.', '.'],
['x', 'x', '.', '.'],
['x', 'x', '.', '.'],
['x', 'x', '.', '.']]
[['Q', 'Q', 'Q', '.'],
['x', 'x', 'x', '.'],
['x', 'x', 'x', '.'],
['x', 'x', 'x', '.']]
虽然它应该是这样的,因为我没有更改我在任何地方打印的变量,但我正在创建它的副本 -
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']],
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
[['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.'],
['.', '.', '.', '.']]
b1
是包含内部 list
的 list
。复制它,使用 list(b1)
或 b1[:]
复制外部 list
,但不复制内部 list
s.
如果您也想复制内部列表,请尝试使用 copy.deepcopy
。