Python的传递列表作为参数

问题描述:

如果我要运行这段代码:Python的传递列表作为参数

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

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

为什么它会返回[“是”]虽然我并没有直接改变变量“示例”,而我怎么可能修改代码,以便“示例”不受函数影响?

+0

http://effbot.org/zone/default-values.htm描述了一个不同但有点相关的问题。阅读可能会帮助您了解正在发生的事情。 – MatrixFrog 2010-02-23 22:04:30

一切都是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'] 
[] 
+3

你也可以使用'myList [:]'创建任何列表的副本,但请记住这是一个“浅拷贝”,这意味着新列表的第n个元素引用与旧元素的第n个元素相同的对象一。 – MatrixFrog 2010-02-23 22:03:05

+0

好点,MatrixFrog – 2010-02-23 22:05:04

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

因为你修改的列表,example

“即使我不直接更改变量'示例'。”

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

正如SO上的其他地方所讨论的,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被该函数更新,请不要将它传递给该函数。

如果您希望函数创建一个新列表,然后编写函数以创建一个新列表。

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

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



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

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