Python 默认参数分配列表长度

Python default parameter assigning length of list

我收到一条错误消息,指出 p2 的 arr 未定义。如果我将 p2 = len(arr) - 1 表达式移动到函数内部,错误就会消失。为什么会出现此错误以及如何使此默认参数表达式起作用?

   def sumZero_refactor(arr, p1 = 0, p2 = len(arr) -1):
NameError: name 'arr' is not defined
def sumZero_refactor(arr, p1 = 0, 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]))

某些语言,例如 Ruby,允许参数列表引用以前命名的参数。不幸的是,Python 没有。

您必须在函数体内添加 p2 = len(arr) - 1

您不能使用参数 arr 然后将 arr 作为 p2 变量,因为 arr 尚未完全定义。

更正后的代码:

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

你可以这样做:

def sumZero_refactor(arr, p1 = 0, p2 = None):
  if p2 == 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]))

这是因为 arr 尚未定义。但是,在函数代码内部定义了 arr

您必须在真正问题所在的参数列表之外定义 arr。您可以将 arr 的长度作为参数传递,而不是在参数列表中查找 arr 的长度。

当仅定义函数且每次调用使用相同的“预计算”值时,默认参数从左到右执行。

即使你在没有长度函数的情况下传递“arr”,你也会看到错误,因为 arr 是 函数定义时未定义。

def sumZero_refactor(arr, p1 = 0, p2 = arr):
   pass

您可以使用“None”并显式测试该值是否作为参数传递。

 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

Python 参考 - https://docs.python.org/3/reference/compound_stmts.html#function-definitions