在Python中传递默认参数和可选参数
我没有传递key in fun(1,2,3)的值。。因此,键的默认值为key=False。但结果是:在Python中传递默认参数和可选参数,python,function,arguments,default,optional-arguments,Python,Function,Arguments,Default,Optional Arguments,我没有传递key in fun(1,2,3)的值。。因此,键的默认值为key=False。但结果是: def fun( key=False,*var): if key is False: print(var) return 0 print("Key is true") return 0 fun(1,2,3) 这些案例相互矛盾为什么会发生这种情况?但是您确实通过了键的1。和[2,3]用于*var 提供给函数的位置参数按其出现的顺序绑定到参数变量。例外情况是关键字参
def fun( key=False,*var):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
这些案例相互矛盾为什么会发生这种情况?但是您确实通过了
键的1
。和[2,3]
用于*var
提供给函数的位置参数按其出现的顺序绑定到参数变量。例外情况是关键字参数,但在调用函数时必须显式命名它们(而您并没有这样做)
因此,您必须颠倒顺序,将关键字参数key
放在末尾。但这在Python2中是无效的语法。标准解决方案(在Python2和Python3中都适用)是切换到关键字参数字典,并仅在以下情况下为参数提供默认值:
由于Python 3.0(有关新语法,请参阅),在位置参数列表之后可以有关键字参数,如下所示:
>>> def fun(*var, **kwargs):
... key = kwargs.pop('key', False)
... print(key)
...
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True
这里的问题是Python将把fun(1,2,3)
中的第一个参数设置为key
,因为这是第一个也是唯一的位置参数。它是可选的这一事实并不重要。由于1
显然不是False
,因此它不会打印var
,而是打印键为true。
。如果您希望仅通过fun(key=True)
之类的方式访问key
,则需要此代码
>>> def fun(*var, key=False):
... print(key)
...
>>> fun(1,2,3)
False
>>> fun(1,2,3, key=True)
True
它正如期工作。为了调试,添加了一个print语句
def fun(*var,**kwargs):
if "key" in kwargs and kwargs["key"] is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
fun(1,2,key=False)
>>> print True == 1
True
>>>
>>> 1 is False
False
>>>
快速签入命令行。。。这就解释了
def fun( key=False,*var):
print key, var
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
这就是为什么控件没有进入if语句内部
def fun(*var,**kwargs):
if "key" in kwargs and kwargs["key"] is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
fun(1,2,key=False)
>>> print True == 1
True
>>>
>>> 1 is False
False
>>>
在任何函数声明中,如果既有位置参数又有关键字参数,那么位置参数必须放在第一位,然后是关键字参数。默认参数应放在最后。
否则,它也将在默认参数中接受为处理而传递的参数
def fun(*var, key=False):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1,2,3)
fun(1,2,3, key=True)
输出:(1,2,3)
输出:键为真
def fun(*var, key=False):
if key is False:
print(var)
return 0
print("Key is true")
return 0
fun(1, 2, 3, key=True)