Python默认参数和参数名称

s_h*_*key 2 python

我想知道'a = a'和'b = b'是否会导致问题/意外行为?代码在示例中工作正常.

def add_func(a=2,b=3):
   return a+b

a=4
b=5
answer = add_func(a=a, b=b)
Run Code Online (Sandbox Code Playgroud)

谢谢

voi*_*hos 5

不是我所知道的,虽然我很想被证明是错的.

形式语言参考定义了函数调用的词法结构.重要的是它将"keyword_item"定义为identifier "=" expression.此外,这里是关于如何解释调用参数的说法:

如果存在关键字参数,则首先将它们转换为位置参数,如下所示.首先,为形式参数创建未填充的槽列表.如果有N个位置参数,则将它们放在前N个槽中.接下来,对于每个关键字参数,标识符用于确定相应的槽(如果标识符与第一个形式参数名称相同,则使用第一个槽,依此类推).如果插槽已填充,则引发TypeError异常.否则,参数的值放在槽中,填充它(即使表达式为None,它填充槽).处理完所有参数后,仍然未填充的插槽将使用函数定义中的相应默认值填充.

这列出了一些可能的场景.

在简单的情况下,就像你提到的那样,有两个正式的参数(ab),如果你使用关键字参数指定函数调用add_func(a=a, b=b),这里发生了什么:

  1. 创建两个插槽来保存参数.
  2. 由于您未在调用中提供任何位置参数(只是关键字参数),因此最初不会填充任何插槽.
  3. 每个关键字参数都单独进行分析,并将参数的标识符(部件中的"a" a=)与函数的所有形式参数名称(定义函数时给定参数的名称)进行比较,在我们的例子中,ab).
  4. 当匹配发生时,关键字参数的(在本例中为4!)用于填充相应的槽.
  5. 重复此过程,直到分析所有关键字参数.如果未填充所有插槽,则Python会尝试为其余插槽分配默认值(如果存在).如果不是,则引发错误.

因此,Python完全不同地处理关键字参数中的"标识符".但这仅适用于关键字参数; 很明显,如果你想是这样add_func(b, a),即使你的参数本身被称为ba,这将不会被映射到函数形式参数; 你的参数会倒退.但是,add_func(b=b, a=a)工作正常; 只要它们是关键字参数,这些位置无关紧要.