Python的传递列表作为参数
如果我要运行这段代码:Python的传递列表作为参数
def function(y):
y.append('yes')
return y
example = list()
function(example)
print(example)
为什么它会返回[“是”]虽然我并没有直接改变变量“示例”,而我怎么可能修改代码,以便“示例”不受函数影响?
一切都是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']
[]
你也可以使用'myList [:]'创建任何列表的副本,但请记住这是一个“浅拷贝”,这意味着新列表的第n个元素引用与旧元素的第n个元素相同的对象一。 – MatrixFrog 2010-02-23 22:03:05
好点,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)
它是因为您在打印列表之前调用了函数。如果您打印该列表,然后调用该函数,然后再次打印该列表,则会得到一个空列表,然后是附加版本。它按您的代码顺序排列。
http://effbot.org/zone/default-values.htm描述了一个不同但有点相关的问题。阅读可能会帮助您了解正在发生的事情。 – MatrixFrog 2010-02-23 22:04:30