Python传递列表作为参数

时间:2010-02-23 21:58:02

标签: python list function arguments

如果我要运行此代码:

def function(y):
    y.append('yes')
    return y

example = list()
function(example)
print(example)

为什么它会返回['yes'],即使我没有直接更改变量'example',我怎么能修改代码以便'example'不受函数的影响?

4 个答案:

答案 0 :(得分:42)

一切都是Python的参考。如果您希望避免这种行为,则必须使用list()创建原始文件的新副本。如果列表包含更多引用,则需要使用deepcopy()

def modify(l):
 l.append('HI')
 return l

def preserve(l):
 t = list(l)
 t.append('HI')
 return t

example = list()
modify(example)
print(example)

example = list()
preserve(example)
print(example)

输出

['HI']
[]

答案 1 :(得分:9)

修改代码的最简单方法是将[:]添加到函数调用中。

def function(y):
    y.append('yes')
    return y



example = list()
function(example[:])
print(example)

答案 2 :(得分:8)

“为什么会返回['yes']

因为您修改了列表example

“即使我没有直接更改变量'example'。”

但是,您提供了由变量example命名的对象到函数中。该函数使用对象的append方法修改了对象。

正如其他地方所讨论的那样,append并没有创造任何新东西。它修改了一个对象。

请参阅Why does list.append evaluate to false?Python append() vs. + operator on lists, why do these give different results?Python lists append return value

我如何修改代码,以便“示例”不受函数影响?

你是什么意思?如果您不希望函数更新example,请不要将其传递给函数。

如果希望该函数创建新列表,则编写该函数以创建新列表。

答案 3 :(得分:0)

因为您在打印列表之前调用了该函数。如果您打印列表然后调用该函数,然后再次打印列表,您将得到一个空列表,后跟附加的版本。它按你的代码顺序排列。