Python 设置关键字参数的默认值时,是否可以引用位置参数?

Python 设置关键字参数的默认值时,是否可以引用位置参数?,python,refactoring,Python,Refactoring,我正在编写一个辅助python函数,它将两个列表作为参数,并对它们进行迭代。通常,第二个列表需要是一个与第一个列表长度相同的零数组。我想将第二个列表设置为关键字参数,并为其指定此默认值 def iterate(list_a, list_b = np.zeros((len(list_a),), dtype=int)): for a, b in zip(list_a, list_b): # do something with a and b 但是,我得到一个错误,列表a没有

我正在编写一个辅助python函数,它将两个列表作为参数,并对它们进行迭代。通常,第二个列表需要是一个与第一个列表长度相同的零数组。我想将第二个列表设置为关键字参数,并为其指定此默认值

def iterate(list_a, list_b = np.zeros((len(list_a),), dtype=int)):
    for a, b in zip(list_a, list_b):
        # do something with a and b
但是,我得到一个错误,列表a没有定义,这表明我在定义函数时不能执行括号中的自引用计算。一个显而易见的解决方案是为list_b选择一个特殊的默认值,如果在调用函数时保持不变,则使用if语句将其更改为零列表:

def iterate(list_a, list_b = 'zeros'):

    if list_b == 'zeros':
        list_b = np.zeros((len(list_a),), dtype=int)

    for a, b in zip(list_a, list_b):
        # do something with a and b
这个解决方案对我来说似乎不是很好,我想知道是否有更好的实践方法来解决这个问题


我有意保持它的通用性,但如果需要,我可以提供有关我的函数的更多细节。

不,这无法完成,但您基本上已经用常规方式解决了问题。 通常在这种情况下,人们会将默认值设置为
None
,并执行相同的操作(只是因为这在键入和linting时不太复杂-函数接受数组或nothing,而不是数组或字符串。)

在可用性方面,您可以告诉用户默认值在doc脚本中的有效作用

def iterate(list_a, list_b=None):
    'list_b defaults to zero array of size a'
    if not list_b:
        list_b = np.zeros((len(list_a),), dtype=int)

    for a, b in zip(list_a, list_b):
        # do something with a and b

不可能的原因是,当您在同一行中调用
list\u a
变量时,它还没有被创建,因为python解释器是逐行执行的。

通常使用
arg=None
,如果仍然没有,则初始化默认值。我喜欢您的第二种方法,但默认参数是
None
。默认参数不能以您希望的方式引用另一个参数,这是正确的。