gpt4 book ai didi

Python 函数参数不是深度复制

转载 作者:太空宇宙 更新时间:2023-11-04 11:16:30 24 4
gpt4 key购买 nike

我有两个相同的函数,但为不同的值设置值,看起来像

indices = [x for x in range(26)]
reflector = [0 for x in range(26)]
wiring = [0 for x in range(26)]

def generate_r(ind=indices,rf=reflector):
while len(ind) > 0:
smp = sample(ind, 2)
for elt in smp:
ind.remove(elt)
rf[smp[0]] = smp[1]
rf[smp[1]] = smp[0]

return rf

def generate_w(ind=indices,wr=wiring):
while len(ind) > 0:
smp = sample(ind, 2)
for elt in smp:
ind.remove(elt)
wr[smp[0]] = smp[1]
wr[smp[1]] = smp[0]
print(wr)
return wr

我早就料到了

generate_r()
generate_w()

返回给我两个包含 0 到 25 之间的 26 个不同值的列表。但是,我发现反射器是我想要的列表,而 w 仍然是一个全 0 的列表。

经过检查,我发现运行 generate_r() 后索引为空,这让我认为 python 没有将索引的副本传递给我的函数,而是传递对同一对象的引用。这是怎么回事?如果是这样,有没有办法让函数的本地命名空间无需在函数本身内创建就可以获取自己的副本?

最佳答案

furas已经为您提供了解决方案。以下是它发生的原因。

>>> def increment(n):
... n.append([4])
>>> L = [1, 2, 3]
>>> increment(L)
>>> print(L)
L = [1, 2, 3, 4] # a changed!

代码 L = [1, 2, 3] 有变量 L 引用包含对三个不可变对象(immutable对象)的引用的列表对象:整数 1、2 和3.

enter image description here

像往常一样,当我们将 L 传递给 increment() 时,该函数的局部变量 nL:

enter image description here

.append() 方法就地修改列表,因为列表是可变的:

enter image description here

由于没有创建新对象并且更改发生在对象的位置,当我们打印 L 时,我们得到修改后的列表。

关于Python 函数参数不是深度复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56895875/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com