将数组/列表传递给 Python 函数
Posted
技术标签:
【中文标题】将数组/列表传递给 Python 函数【英文标题】:Passing an array/list into a Python function 【发布时间】:2011-04-27 00:52:24 【问题描述】:我一直在研究将数组或列表(Python 倾向于调用它们)传递给函数。
我读到了一些关于使用 *args 的文章,例如:
def someFunc(*args)
for x in args
print x
但不确定这是对还是错。似乎没有什么可以按我的意愿工作。我曾经能够轻松地将数组传递给 php 函数,这让我很困惑。看来我也不能这样做:
def someFunc(*args, someString)
因为它抛出了一个错误。
我想我只是把自己完全弄糊涂了,想找人帮我解决。
【问题讨论】:
docs.python.org/tutorial/… 简要说明使用星号。这意味着您可以传递任意数量的参数,它们将被包装在一个元组中(可以像函数中的列表一样访问它)。带有星号的参数名称必须放在最后,以便 Python 知道哪个是哪个。 “Python 倾向于这样称呼它们”?这不是“趋势”。这是一个定义问题。 S.Lott,冷静点!我认为您在那儿有点苛刻-该评论是否对对话增加了任何内容?没有。 你可以认为这很苛刻。然而,单词选择很重要,因为其他知识较少的人会读到这个。我建议“倾向于称呼他们”是一个糟糕的词选择,因为它会使某人感到困惑。有足够的 Python 问题用“array”而不是“list”。这表明人们没有使用正确的术语并且没有成功搜索现有文档。有足够的混乱。这是一个“清单”。真的。你也可以使用这个词,而不必担心矛盾。 最有趣的部分......虽然我很欣赏 S.Lott 对文字的关心,但 Python 列表实际上是作为动态数组实现的......哈哈。 【参考方案1】:当您使用此语法定义函数时:
def someFunc(*args):
for x in args
print x
您是在告诉它您期望参数数量可变。如果你想传入一个列表(来自其他语言的数组),你可以这样做:
def someFunc(myList = [], *args):
for x in myList:
print x
然后你可以这样调用它:
items = [1,2,3,4,5]
someFunc(items)
您需要在变量参数之前定义命名参数,在关键字参数之前定义变量参数。你也可以这样:
def someFunc(arg1, arg2, arg3, *args, **kwargs):
for x in args
print x
至少需要三个参数,并支持可变数量的其他参数和关键字参数。
【讨论】:
小心使用可变对象作为默认参数! def someFunc(myList = []): myList.append(1)
someFunc 在没有参数的情况下被调用两次将返回 [1, 1],因为默认参数只被构造一次,当函数定义被计算时.
@Rafal Rawicki 我不清楚 myList
仅被构造一次,它如何影响它在调用之间存储的内容。人们会期望 myList
在每次通话开始时为空,但正如您所指出的那样,情况并非如此。这是因为myList
不是someFunc
范围内的本地的吗?
*args
在您的第二个示例 def someFunc(myList = [], *args):
中做了什么,而更简单的 def someFunc(myList = []):
没有做?谢谢。编辑:哦,等等,这意味着您可以将myList
作为列表或元组传递。无论哪种方式都有效。对吗?
@PatrickT - 不。这意味着该函数采用myList
参数(并提供默认值),并且它还采用开放式数量的附加参数(示例中未使用它们)。
@PatrickT - 是的,但你混淆了一些术语,这可能会导致以后的混乱。当您编写someFunc(1, 2)
时,您不是在“传递元组”,而是在“使用两个参数调用函数”。要真正传递一个元组,你可以写someFunc((1, 2))
。请注意,这会将元组值 (1, 2)
放在 myList
中,并且额外的 args 仍然为空。你可以写 someFunc((1, 2), 3)
在这种情况下你既“传递一个元组”又“提供额外的参数”。【参考方案2】:
您可以像传递其他类型一样传递列表:
l = [1,2,3]
def stuff(a):
for x in a:
print a
stuff(l)
这将打印列表 l。请记住,列表是作为引用而不是作为深层副本传递的。
【讨论】:
【参考方案3】:您不需要使用星号来接受列表。
只需在定义中给参数一个名称,然后传入一个类似的列表
def takes_list(a_list):
for item in a_list:
print item
【讨论】:
【参考方案4】:Python 列表(不仅仅是数组,因为它们的大小可以随时更改)是普通的 Python 对象,可以作为任何变量传递给函数。 * 语法用于解包列表,这可能不是您现在想做的事情。
【讨论】:
【参考方案5】:def sumlist(items=[]):
sum = 0
for i in items:
sum += i
return sum
t=sumlist([2,4,8,1])
print(t)
【讨论】:
以上是关于将数组/列表传递给 Python 函数的主要内容,如果未能解决你的问题,请参考以下文章