在Python中传递默认参数和可选参数

在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 提供给函数的位置参数按其出现的顺序绑定到参数变量。例外情况是关键字参

我没有传递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

提供给函数的位置参数按其出现的顺序绑定到参数变量。例外情况是关键字参数,但在调用函数时必须显式命名它们(而您并没有这样做)

因此,您必须颠倒顺序,将关键字参数
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)