Python将列表作为参数传递

Posted

技术标签:

【中文标题】Python将列表作为参数传递【英文标题】:Python passing list as argument 【发布时间】:2011-01-20 07:02:35 【问题描述】:

如果我要运行这段代码:

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

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

为什么即使我没有直接更改变量“example”,它也会返回 ['yes'],以及如何修改代码以使“example”不受函数影响?

【问题讨论】:

effbot.org/zone/default-values.htm 描述了一个不同但有些相关的问题。阅读这可能有助于您了解正在发生的事情。 另一种看待它的方式:您可以附加到函数中的列表,这非常有用。 【参考方案1】:

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 个引用相同的对象旧元素。【参考方案2】:

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

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



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

【讨论】:

【参考方案3】:

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

因为你修改了列表,example

“即使我没有直接更改变量 '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 被函数更新,请不要将其传递给函数。

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

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于Python将列表作为参数传递的主要内容,如果未能解决你的问题,请参考以下文章

将列表作为查询参数传递[重复]

如何将列表作为球拍中的参数列表传递?

Python将ref int作为参数传递

将列表/数组作为参数/返回类型传递并返回给 Redshift 中的 UDF

如何将列表的所有元素作为函数的参数传递而不将列表作为参数传递

将列表作为参数传递给 Python C 模块?