【问题标题】:Modifying a list in python by passing it to a function通过将列表传递给函数来修改python中的列表
【发布时间】:2016-06-09 01:01:39
【问题描述】:

我有以下 python 代码:

def make_great(l):
    l = ['The great ' + magician for magician in l]

magicians = ['Tom']
make_great(magicians)
print(magicians)

print 语句打印原始列表,而不是由make_great() 函数修改的列表。我试图找出一种方法来修改 python 列表的每个元素,而不显式访问它的索引,然后为该索引重新分配一个新值。 magicians 列表现在不会指向基于 Python 内存模型的理解形成的新列表吗?我猜我没有得到想要的结果,因为这是一个范围界定问题?但是当我传入magicians 时,它会替换函数参数中的l,因此python 解释器实际上会看到magicians = ['The ...?

【问题讨论】:

  • 问题是你正在修改局部变量l 来引用一个新对象。相反,您应该修改 l 引用的对象。
  • 我很困惑,当我使用索引符号l[i] 来修改列表时,为什么不认为是局部变量,但是当我使用= 运算符重新分配@987654331 @ 到一个新列表,它现在被认为是本地的?
  • @MutatingAlgorithm 考虑将 l 变量名称重命名为 lst 或其他更好读的名称,因为它可以防止与数字 1 混淆。

标签: python list function


【解决方案1】:
def make_great(l):
    return ['The great ' + magician for magician in l]

magicians = ['Tom']
magicians = make_great(magicians)
print(magicians)

make_great 函数复制了您的数组,因此您需要返回并将结果分配给魔术师。

您可以检查How do I pass a variable by reference? 在函数中传递引用或值

【讨论】:

    【解决方案2】:

    你的函数没有返回任何东西。您可以在函数中使用 print 语句,也可以返回修改后的列表然后打印它

    【讨论】:

      【解决方案3】:

      当您将其分配给l 时,您是在重新定义l,而不是修改它。请改用l[:]:

      def make_great(l):
          l[:] = ['The great ' + magician for magician in l]
      

      您也可以返回列表并重新定义magicians:

      def make_great(l):
          return ['The great ' + magician for magician in l]
      
      magicians = ['Tom']
      magicians = make_great(magicians)
      print(magicians)
      

      在这种情况下,您可以将magicians 分配给make_great(['Tom']):

      magicians = make_great(['Tom'])
      print(magicians)
      

      【讨论】:

        猜你喜欢
        • 2016-03-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-08-31
        • 1970-01-01
        • 1970-01-01
        • 2011-04-27
        • 2013-07-04
        相关资源
        最近更新 更多