函数定义中带星号的变量的默认初始化问题

4
众所周知,在Python中,为了在函数内设置变量的默认值,需要使用以下语法:
def func(x = 0):
    if x == 0:
        print("x is equal to 0")
    else:
        print("x is not equal to 0")

如果该函数被这样调用:

>>> func()

它导致了
'x is equal to 0'

但是当类似的技术用于星号变量时,例如:
def func(*x = (0, 0)):

这会导致语法错误。我尝试了改变语法,如使用 (*x = 0, 0),但仍遇到同样的错误。是否可以将星号变量初始化为默认值?


这个问题可能对你有所帮助: https://dev59.com/TmUp5IYBdhLWcg3wY29V - deweyredman
2个回答

2

星号变量是非标准变量,旨在允许具有任意长度的函数。

*variables 是包含所有位置参数的元组(通常命名为args)。

**variables 是包含所有命名参数的字典(通常命名为kwargs)。

它们总是存在的,如果没有提供,则为空。您可以根据参数类型测试字典或元组中是否存在值并对其进行初始化。

def arg_test(*args,**kwargs):
   if not args:
      print "* not args provided set default here"
      print args
   else:
      print "* Positional Args provided"
      print args


   if not kwargs:
      print "* not kwargs provided set default here"
      print kwargs
   else:
      print "* Named arguments provided"
      print kwargs

#no args, no kwargs
print "____ calling with no arguments ___"
arg_test()

#args, no kwargs
print "____ calling with positional arguments ___"
arg_test("a", "b", "c")

#no args, but kwargs
print "____ calling with named arguments ___"
arg_test(a = 1, b = 2, c = 3)

哦,我想我只是过度思考了,谢谢! - user7318820
最初,args和kwargs让我有点困惑 :) - Youn Elan

2
星号变量默认值为一个空元组()。由于星号参数的工作方式,无法更改默认值(简而言之:如果有未加星号的参数可用,Python将分配它们并收集其余参数到一个元组中;您可以在相关PEP 3132中了解更多信息:https://www.python.org/dev/peps/pep-3132/)。但是,您可以在函数开头实现检查以查找x是否为空元组,然后相应地进行更改。您的代码应该如下所示:
def func(*x):
    if x == ():  # Check if x is an empty tuple
        x = (0, 0)
    if x == 0:
        print("x is equal to 0")
    else:
        print("x is not equal to 0")

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