考虑以下最小示例:
def arfunc(x,*a):
sa=a[1]
return sa
b=arfunc(1.,(5.,2.))
print(b)
我需要传递一个数组,数组的长度可能随函数而异,然后使用该函数中的单个数组元素。如果我在函数中用a[1]
交换了a[0]
,则返回整个列表。为什么这不起作用,我如何使其起作用?
答案 0 :(得分:3)
带有可变参数(def checkNeighbours(i,j):
alive_nodes=0
if(labels[i+1][j].getColor()=="black"):
alive_nodes+=1
if(labels[i][j+1].getColor()=="black"):
alive_nodes+=1
if(labels[i-1][j].getColor()=="black"):
alive_nodes+=1
if(labels[i][j-1].getColor()=="black"):
alive_nodes+=1
if(labels[i+1][j+1].getColor()=="black"):
alive_nodes+=1
if(labels[i-1][j-1].getColor()=="black"):
alive_nodes+=1
if(labels[i+1][j-1].getColor()=="black"):
alive_nodes+=1
if(labels[i-1][j+1].getColor()=="black"):
alive_nodes+=1
return alive_nodes
)的函数希望它们作为多个参数:
*args
如果要像以前一样使用该功能,请删除星号:
b=arfunc(1., 5., 2.)
print(b)
答案 1 :(得分:1)
* 符号允许函数具有可变参数类型。变量 a 将成为在第一个变量 x 之后传递的所有位置参数的集合。
不需要使用 * 符号来使 a 具有可变长度。列表在Python中已经具有该属性。
答案 2 :(得分:1)
您错过了一件事情,那就是如果我们必须将可变长度参数(在python中称为Arbitrary Arguments)传递给函数,则需要添加*(星号)
def arfunc(x,*a): # here *a can hold argument that may vary in numbers.
sa=a[1]
return sa
b=arfunc(1.,*(5.,2.)) # here you also have to provide a arbitary arguments like this.
print(b)
为更好地理解,请参考以下书面代码:
def arfunc(x,*a):
sa=a[1]
return sa
d = 1.
e = (5.,2.)
b=arfunc(d,*e)
print(b)
答案 3 :(得分:0)
您可以传递列表或列表列表。
例如
列表-
[1,2,3,4]
列表列表-
[1,2,3[4,5,6]]
如果那是您要尝试做的事情。
答案 4 :(得分:0)
星号“ *”用于从列表中解压缩参数。当函数需要随机数的参数时,它类似于C / C ++或Java中的varargs。在这种情况下,您无法更改原始列表/数组。
但是,如果需要传递一个数组,则将在函数内部进行更改,然后将其返回,建议您在不带解包运算符*的情况下传递和传递数组或列表。示例:
def try_to_change_list_contents(the_list):
print('got', the_list)
the_list.append('four')
print('changed to', the_list)
outer_list = ['one', 'two', 'three']
print('before, outer_list =', outer_list)
try_to_change_list_contents(outer_list)
print('after, outer_list =', outer_list)
您也可以看一下这篇文章: topic