【问题标题】:Python passing list into a function and return back to mainPython将列表传递给函数并返回到main
【发布时间】:2015-07-08 09:37:35
【问题描述】:

我从用户那里获取 3 个值。 Number1、Number2 和 Power,将 Number1 和 Number2 视为列表的范围。然后我试图将数字列表作为参数传递给函数,同时将功率值作为另一个参数。使用 pow 函数使用 for 循环计算列表中每个数字的幂。我想将结果存储在传递给这个函数的同一个列表中,然后返回到主函数并在那里打印。现在的问题是,我假设我尝试了错误的方法,因为输出不符合预期。我声明了另一个列表(结果)并将数字列表中的所有功率结果存储到其中。然后将结果列表分配给数字列表,以便复制其中的所有值。现在,当我返回数字列表并在主函数中打印时,它仍然显示与发送到函数之前数字列表中相同的值。虽然当我尝试在函数内打印列表时,它给出了正确的输出。我哪里错了,我应该如何改正?

def powerList(numbers, power):
   print("In the function")
   print(numbers)
   print("Calculating powers")

   result = []
   for x in range(len(numbers)):
      result.append(pow(numbers[x], power))

   numbers = result
   return(numbers)

def main():
   n1 = int(input("Input number1: "))
   n2 = int(input("Input number2: "))
   power =  int(input("Input power: "))
   numbers = [x for x in range(n1,n2+1)]
   print(numbers)
   print("Passed to the function powerList")
   powerList(numbers, power)
   print(numbers)

main() 

【问题讨论】:

  • 您必须意识到powerList 函数中的numbers = result 行并不像您想的那样。它替换了 local 变量numbers,但它不影响powerList 函数之外的numbers 变量。因此,只需按照 Vignesh Kalai 的建议进行操作即可。
  • 您要更改原始列表,还是创建一个新列表
  • 原始列表。我跟着 Vignesh Kalai,它似乎奏效了。
  • 不,该答案在powerList 中创建一个新列表(最初名为result),返回它并仅将numbers 中的名称main 重新分配给新列表。这不会改变 numbers 最初提到的列表;您可以通过添加例如看到这一点print(id(numbers)) 前后行numbers = powerList(numbers, power)
  • 参见例如docs.python.org/2/library/functions.html#id - 如果两个名称同时给出相同的 id 值,则它们指向同一个确切的对象。

标签: python list python-3.x


【解决方案1】:

如果您希望函数改变参数列表,请明确地这样做并且(按照惯例)return None,例如:

def power_list(numbers, power):  # note PEP-8 naming style
    for index, item in enumerate(numbers):
        numbers[index] = pow(item, power)
    # no explicit return is equivalent to 'return None'

一次替换一个元素numbers的内容,或者:

def power_list(numbers, power):
    numbers[:] = [pow(number, power) for number in numbers]

它使用list comprehension 创建一个新列表,然后用新值覆盖原始内容。正在使用中,使用任一版本:

>>> lst = range(5)
>>> lst
[0, 1, 2, 3, 4]
>>> power_list(lst, 2)
>>> lst
[0, 1, 4, 9, 16]

【讨论】:

  • 谢谢。它工作正常,从技术上讲是一个更好的答案。
【解决方案2】:

尝试获取返回的对象:

numbers = powerList(numbers, power)

您可以做的另一件事是直接返回函数输出而不将其保存到另一个变量:

return powerList(numbers, power)

【讨论】:

    【解决方案3】:

    您正在返回数字但未获得返回值:
    检查函数中的这条语句:
    numbers = powerList(numbers, power)

    def powerList(numbers, power):
       print("In the function")
       print(numbers)
       print("Calculating powers")
    
       result = []
       for x in range(len(numbers)):
          result.append(pow(numbers[x], power))
    
       numbers = result
       return(numbers)
    
    def main():
       n1 = int(input("Input number1: "))
       n2 = int(input("Input number2: "))
       power =  int(input("Input power: "))
       numbers = [x for x in range(n1,n2+1)]
       print(numbers)
       print("Passed to the function powerList")
       numbers = powerList(numbers, power)
       print(numbers)
    
    main() 
    

    【讨论】:

      【解决方案4】:

      在 Python 中,列表是引用,因此,您可以在函数内更改列表内容,并且列表将在主函数中更改:

      In [7]: def foo(l):
         ...:     l.append(42)
         ...:     
      
      In [8]: xs = [1, 2, 3]
      
      In [9]: foo(xs)
      
      In [10]: xs
      Out[10]: [1, 2, 3, 42]
      

      但是,重新分配列表不会影响主列表:

      In [11]: def bar(l):
         ....:     l = [42]
         ....:     
      
      In [12]: bar(xs)
      
      In [13]: xs
      Out[13]: [1, 2, 3, 42]
      

      相反,您可以返回新列表:

      In [14]: def baz(l):
         ....:     return l + [3.14]
         ....: 
      
      In [15]: baz(xs)
      Out[15]: [1, 2, 3, 42, 3.14]
      

      当然,将它分配给另一个变量:

      In [16]: new_list = baz(xs)
      
      In [17]: print(new_list)
      [1, 2, 3, 42, 3.14]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-08
        • 2020-08-19
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        相关资源
        最近更新 更多