gpt4 book ai didi

python - 将列表的值更改为函数参数

转载 作者:太空宇宙 更新时间:2023-11-03 11:45:19 25 4
gpt4 key购买 nike

我知道当将列表作为参数发送给函数时,函数中的更改会更改列表,例如:

p=[[3, 4], [2, 3]]
node=[5,3]

def foo(node, p_as_list):
p_as_list.append(node)


foo(node, p)
print(p) #p changes

停止我使用 copy() 的更改:

p=[[3, 4], [2, 3]]
node=[5,3]

def foo(node, p_as_list):
p_as_list.append(node)

#this line
foo(node, p.copy())
print(p) # without changes

但是如果我这样改变函数:

p=[[3, 4], [2, 3]]
node=[5,3]

def foo(node, p_as_list):
#this line
p_as_list=p_as_list[-1]
p_as_list.append(node)

foo(node, p.copy())
print(p)

p又会变,我不明白为什么会这样?

最佳答案

插入一些调试 print 有助于确定问题:

p=[[3, 4], [2, 3]]
node=[5,3]

def foo(node, p_as_list):
#this line
print('p', id(p_as_list))
p_as_list=p_as_list[-1]
print('pm1', id(p_as_list))
p_as_list.append(node)

print('p', id(p))
print('pm1', id(p[-1]))
foo(node, p.copy())
print(p)

这打印:

p 1872370555144 
pm1 1872370556232
p 1872370108872
pm1 1872370556232
[[3, 4], [2, 3, [5, 3]]]

请注意,p[-1]id 没有改变,您对同一个list 进行操作。这是因为当您使用 list.copy() 时,您只创建了一个浅拷贝!

与其复制整个列表,我建议只复制您在函数中修改的部分:

p=[[3, 4], [2, 3]]
node=[5,3]

def foo(node, p_as_list):
#this line
p_as_list=p_as_list[-1].copy() # copy here!
p_as_list.append(node)

foo(node, p) # don't copy here!
print(p)

关于python - 将列表的值更改为函数参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41222216/

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