【问题标题】:How do I append/prepend list in function without modifying source?如何在不修改源的情况下在函数中附加/前置列表?
【发布时间】:2021-03-05 20:27:30
【问题描述】:

鉴于此来源列表:

source_list = [2, 3, 4]

还有这个功能:

def function(list_in):
    list_in.append(5)
    list_in.insert(0, 1)
    return list_in

不出所料,我得到:

>>> function(source_list)
[1, 2, 3, 4, 5]

但如果我在函数之外调用变量 source_list,我仍然会得到:

>>> source_list
[1, 2, 3, 4, 5]

是否有其他方法可以修改(特别是附加/预先添加到)函数中的列表,从而不更改原始列表?

【问题讨论】:

    标签: python python-3.x list defensive-copy


    【解决方案1】:

    如果你是函数的调用者,可以先复制

    new_list = function(source_list[:])
    

    这样做的好处是调用者可以决定是否要修改其当前列表。

    【讨论】:

      【解决方案2】:

      如果你可以访问该函数,你可以复制传递的列表:

      像这样:

      def function(list_in_):     # notice the underscore suffix
          list_in = list_in_[:]   # copy the arg into a new list
          list_in.append(5)
          list_in.insert(0, 1)
          return list_in          # return the new list
      

      否则,您可以使用 source_list 的副本调用该函数,并决定是否需要一个新列表,或者您是否更喜欢 source_list 突变,如 @tdelaney 所示

      【讨论】:

        【解决方案3】:

        可以使用copy()的方法就可以了:

        new_list = function(source_list.copy())
        

        【讨论】:

          【解决方案4】:

          在你的函数中添加一行:

             def function(list_n):
              #Do a copy of your list
              list_in = list_n.copy()
              list_in.append(5)
              list_in.insert(0, 1)
              return list_in
          

          【讨论】:

            【解决方案5】:

            试试这个。由于在代码中运行函数时源列表被修改,因此您无法保留源列表。

            source_list = [2, 3, 4]
            list_in=source_list.copy()
            def function(list_in):
                list_in.append(5)
                list_in.insert(0, 1)
                return list_in
            print(function(list_in))
            print(source_list)
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-01
              • 2017-11-26
              • 2022-12-15
              • 2022-01-16
              • 2019-08-27
              • 1970-01-01
              相关资源
              最近更新 更多