将数组/列表传递给 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 函数的主要内容,如果未能解决你的问题,请参考以下文章

将字典的键和值并行传递给函数?

将数组传递给 PostgreSQL PL/pgSQL 函数

将参数列表传递给Python函数[重复]

将变量和列表传递给 Python 中的函数

将数组从jquery传递给python函数时如何设置url?

ctypes给扩展模块中的函数传递数组和结构体