将数组/列表传递到Python函数中

66

我一直在研究如何将数组或列表(Python 常称其为列表)传递给函数。

我读到关于使用 *args 的内容,例如:

def someFunc(*args)
    for x in args
        print x

但不确定这是否正确 / 错误。没有任何东西像我想要的那样工作。我习惯于能够轻松将数组传递给PHP函数,这让我感到困惑。似乎我也不能这样做:

def someFunc(*args, someString)

由于它抛出了一个错误。

我觉得我已经完全搞混了,希望有人能为我解惑。


2
http://docs.python.org/tutorial/controlflow.html#arbitrary-argument-lists简要介绍了如何使用星号。它意味着您可以传递任意数量的参数,并且它们将被包装在一个元组中(在函数内部可以像列表一样访问)。带有星号的参数名称必须放在最后,以便Python知道哪个是哪个。 - JAL
1
作为Python的定义,它们被称为这样并不是一种“倾向”。 - S.Lott
17
S.Lott,冷静点!我认为你有点严厉了——那个评论有没有为对话增添什么内容?没有。 - Jack Franklin
7
你可以认为这很严厉。但是,词语的选择非常重要,因为其他不太了解的人也会阅读这些内容。我建议“倾向称之为它们”是一个不恰当的词语选择,因为它会让某些人感到困惑。已经有足够多的 Python 问题使用了“array”而不是“list”。这表明人们没有使用正确的术语,并且没有成功地搜索现有的文档。混淆已经足够了。“list”才是正确的术语,你也可以毫不犹豫地使用这个词。 - S.Lott
6
最有趣的部分是......虽然我欣赏S.Lott对用词的小心,在Python中,列表实际上是以动态数组的形式实现的......哈哈。 - anon01
这不太清楚:是想要单独创建多个参数并从列表元素中传递吗?还是想要传递一个参数,即列表本身? - Karl Knechtel
6个回答

95

当您使用以下语法定义函数时:

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

函数至少需要三个参数,并支持可变数量的其他参数和关键字参数。


19
当心在默认参数中使用可变对象!<code> def someFunc(myList = []): myList.append(1) </code> 如果不传入参数调用someFunc两次,它将返回[1, 1],因为默认参数只会在函数定义时被构建一次。 - Rafał Rawicki
在你的第二个例子中,def someFunc(myList = [], *args):中的*args是什么意思,而简单的def someFunc(myList = []):则没有这个功能?谢谢。编辑:哦,等等,这意味着你可以将myList作为列表或元组传递。两种方式都可以,对吗? - PatrickT
1
@g.d.d.c,感谢您的回复。因此,如果我传递一个元组,例如 someFunc(1, 2),其中1放入了myList,而2是可选的附加参数之一。这次我理解的对吗? - PatrickT
1
@PatrickT - 是的,但是在术语上你混淆了一些东西,这可能会导致以后的混淆。当你写 someFunc(1, 2) 时,你不是“传递一个元组”,而是“使用两个参数调用函数”。要实际传递一个元组,你应该写 someFunc((1, 2))。请注意,这将把元组值 (1, 2) 放入 myList 中,而额外的参数仍将为空。你可以写 someFunc((1, 2), 3),这样你既“传递了一个元组”,又“提供了额外的参数”。 - g.d.d.c
@g.d.d.c 非常感谢。我没有意识到在传递给函数时元组周围的括号是必需的(通常我看到的元组用法是 x,y = 1,2,没有括号)。现在一切都清楚了。 - PatrickT
显示剩余2条评论

37

您可以像其他类型一样传递列表:

l = [1,2,3]

def stuff(a):
   for x in a:
      print a


stuff(l)

这会打印出列表l。请记住,列表作为引用传递,而不是作为深拷贝。


8
你不需要使用星号来接受一个列表。
在定义中给参数命名,并像这样传递一个列表即可。
def takes_list(a_list):
    for item in a_list:
         print item

8

Python列表(不仅仅是数组,因为它们的大小可以随时更改)是普通的Python对象,可以像任何变量一样传递给函数。 *语法用于解包列表,这可能不是您现在想要做的事情。


2
def sumlist(items=[]):
    sum = 0
    for i in items:
        sum += i

    return sum

t=sumlist([2,4,8,1])
print(t)

1

有一种方法可以直接传递列表而不是函数参数。在这种情况下,您拥有具有固定数量参数的函数,希望将它们打包到列表中,并使用列表调用函数。

函数scipy.optimize.curve_fit利用此功能,因为它期望由先验未知数量的值参数化的函数,例如,您可以指定

import numpy as np
def f(x, a0, a1, a2):
   return a0+a1*np.exp(a2*x)

拥有一个由三个参数参数化的函数。然后你调用
fit, cov = curve_fit(f, xdata, ydata)
函数返回与参数数量对应长度的 fit 列表,有趣的是,你可以通过调用下面的方式,在点 x 处获取由 fit 参数参数化的函数的值 v:
fit=[1,2,3]
x=0
v = f(x, *fit)

请查看scipy源代码


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接