【问题标题】:Replace contents of a list passed as an argument替换作为参数传递的列表的内容
【发布时间】:2016-03-22 08:15:18
【问题描述】:

我正在尝试编写执行此操作的代码:

the_list = ['some list', 0, 1, 2]

def change(l):
    x = ['some other list', 3, 4, 5]
    l <- x

change(the_list)
print(the_list)    # ['some other list', 3, 4, 5]

即用x 的内容替换列表l 的内容。 最pythonic的方法是什么?

【问题讨论】:

    标签: python


    【解决方案1】:

    您可以在函数change中替换l的内容:

    def change(l):
        x = ['some other list', 3, 4, 5]
        l[:] = x
    

    这会将切片范围(在本例中为整个列表)替换为给定可迭代的内容。

    【讨论】:

    • 请注意别名。如果您有list1 = ['some list']list2 = list1,运行change(list1) 将同时更改list1list2。你可以通过设置list2 = list1[:]来避免这种情况。
    【解决方案2】:

    这里的问题是你不能在 Python 中使用指针。因此,将新对象分配给您的参数变量不会改变外部范围内的值。但是您可以使用具有显式 getset 方法的对象来做到这一点。我从Simulating Pointers in Python 借来了代码。另请参阅Pointers in Python? 以进行进一步讨论。

    class ref:
        def __init__(self, obj): self.obj = obj
        def get(self):    return self.obj
        def set(self, obj):      self.obj = obj
    
    def change(l):
        x = ['some other list', 3, 4, 5]
        l.set(x)
    
    the_list=ref(['some list', 0, 1, 2])
    change(the_list)
    print(the_list.get())    
    

    因为您可以通过l[:]=x 明确设置列表,如niemmi 回答中所述,您也可以这样做。

    【讨论】:

      【解决方案3】:

      函数应该已经可以访问外部作用域,因为 python 会在本地查找,然后在作用域中向上移动,直到找到变量名或错误。

      所以你应该能够做到这一点。

      the_list = ['some list', 0, 1, 2]
      
      def change():
          x = ['some other list', 3, 4, 5]
          for item in x:
              the_list.append(item)
      
      change()
      print(the_list) 
      

      添加输出

      ['some list', 0, 1, 2, 'some other list', 3, 4, 5]
      

      【讨论】:

      • 我试图避免追加,因为这些是性能怪物。此外,它是关于覆盖列表的内容,而不是附加到它
      • 如果你愿意,你可以避免追加,关键是你可以随意使用外部范围,你可以使用它,它会全局改变。
      猜你喜欢
      • 2012-01-07
      • 1970-01-01
      • 2015-01-25
      • 2021-03-01
      • 2011-01-20
      • 1970-01-01
      • 2022-01-02
      • 2012-04-03
      • 1970-01-01
      相关资源
      最近更新 更多