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

时间:2016-12-19 12:05:35

标签: python parameter-passing

我知道当一个列表作为参数发送到一个函数时,函数的更改将改变列表,例如:

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会再次改变,我不明白为什么会发生这种情况?

2 个答案:

答案 0 :(得分:1)

插入一些调试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]]]

请注意,id的{​​{1}}未发生变化,您使用相同的p[-1]进行操作。这是因为您在使用list

时只创建浅拷贝

而不是list.copy()整个列表,我建议只复制你在函数中修改的部分

copy

答案 1 :(得分:0)

执行此操作的一种方法是使用deepcopy

参考图书馆路径:https://docs.python.org/2/library/copy.html

import copy

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

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

foo(node, copy.deepcopy(p))

print(p)