Python函数默认参数设为len(arr)-1报NameError的原因及解决方法
报错原因
Python函数的默认参数求值时机为函数定义阶段,而非函数调用阶段。当解释器解析def语句完成函数定义时,会立刻计算所有默认参数表达式的结果并固化存储,此时参数列表中的arr仅为未绑定实际值的形参标识,并未在当前作用域生成可访问的变量,因此len(arr) - 1执行时会抛出NameError。
默认参数定义完成后,函数内部的代码只会在每次函数被调用时才执行,此时arr已经被传入了实际参数值,作用域内可正常访问,因此将计算逻辑移入函数内不会报错。
修复方案
使用None作为默认占位符,在函数内部判断后再计算p2的默认值即可,修改后的代码如下:
def sumZero_refactor(arr, p1 = 0, p2 = None): if p2 is None: p2 = len(arr) - 1 while p1 < p2: if arr[p1] + arr[p2] == 0: return [arr[p1], arr[p2]] elif arr[p1] + arr[p2] < 0: p1 += 1 else: p2 -= 1 print(sumZero_refactor([-3, -2, -1, 0, 1, 2, 3])) print(sumZero_refactor([-2, 0, 1, 3])) print(sumZero_refactor([1, 2, 3])) print(sumZero_refactor([-8, -7, -5, -2, 0, 1, 2, 3, 4, 5, 6]))
内容的提问来源于stack exchange,提问作者user12738756
相关产品推荐
相关产品推荐

