在这段代码中,我期待list A
具有相同的值,即使我将其分配给另一个temp
变量,然后使用函数A
打印参数foo
。但是,如果A是标量,例如A=3
然后A
的价值即使在调用foo
后仍保持不变。
我哪里错了?变量范围有问题吗?我找到了一些相关的Strange behavior of lists in python答案,但无法弄清楚我的问题。
A = [ [ 0 for i in range(3) ] for j in range(3) ]
def foo(input):
temp= input
temp[0][0]=12
print(input)
print(A)
answer = foo(A)
输出:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[12, 0, 0], [0, 0, 0], [0, 0, 0]]
而不是输入,使用.copy
这将生成数组的副本并为temp分配新地址,你做的是浅拷贝,其中temp = input,只是将输入数组的地址复制到temp,而不是复制的清单。
所以你可能做foo(A.copy())
或temp=input.copy()
也注意输入不是一个好名字,因为它已经分配给python函数,使用像foo_arg之类的东西
请这个,我用了深度镜
from copy import copy, deepcopy
A = [ [ 0 for i in range(3) ] for j in range(3) ]
def foo(input):
temp = deepcopy(input)
temp[0][0]=12
return temp
print('origin', A)
answer = foo(A)
print('after', A)
print('result', answer)
结果:
origin [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
after [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
result [[12, 0, 0], [0, 0, 0], [0, 0, 0]]