【问题标题】:Python default parameter assigning length of listPython默认参数分配列表的长度
【发布时间】:2021-08-28 17:54:21
【问题描述】:

我收到一条错误消息,提示 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]))

【问题讨论】:

  • def sumZero_refactor(arr, p1=0, p2=None): p2 = p2 if p2 is not None else len(arr)
  • 也许OP可以澄清,但关于其他答案,我没有得到需要为p2传递非默认值的印象,只是设置@987654325参数列表中的 @ 很方便。

标签: python list default-arguments


【解决方案1】:

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

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

【讨论】:

  • 如果我像函数 sumZero_refactor(arr, p1 = 0, p2 = arr.length - 1) 一样重写我在 Javascript 中所做的事情,这没有问题。我猜Python不接受这个。谢谢。
【解决方案2】:

您不能使用参数 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

【讨论】:

    【解决方案3】:

    你可以这样做:

    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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        即使您传递“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

        【讨论】:

          猜你喜欢
          • 2018-04-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-21
          • 2013-08-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多