【问题标题】:Python: How to append list values into the list properly?Python:如何正确地将列表值附加到列表中?
【发布时间】:2014-11-11 18:31:39
【问题描述】:

我想将临时列表的值添加到主列表中。我尝试将一些值添加到临时列表中,然后将临时列表附加到主列表中,如下所示,但它始终显示主列表中的最新值。

>>> temp =[]
>>> temp.append(123)
>>> temp.append(10)
>>> temp.append(18)
>>> mutR =[]
>>> mutR.append(temp)
>>> print mutR
[[123, 10, 18]]
>>> temp[:]=[]
>>> temp.append(3)
>>> temp.append(4)
>>> temp.append(5)
>>> mutR.append(temp)
>>> print mutR
[[3, 4, 5], [3, 4, 5]]

我的期望是:

>>> print mutR
[[123, 10, 18], [3, 4, 5]] 

但它是[[3, 4, 5], [3, 4, 5]]。

【问题讨论】:

    标签: python list


    【解决方案1】:

    声明

    temp[:] = []
    

    从temp中删除所有元素,你想要做的是

    temp = []
    

    这将创建一个新的空列表并将其引用存储到temp。

    在您的代码中只有一个列表对象,添加两次到mutR,如果您添加例如

    temp.append(99)
    print mutR
    

    对于您的原始代码,您将看到 [[3, 4, 5, 99], [3, 4, 5, 99]] 作为答案。

    【讨论】:

      【解决方案2】:

      问题是当您将temp 附加到mutR 时,mutR 仅包含对temp 的引用。无论对temp 应用什么更改,temp in mutR 也将相应更改。因此,解决方案是使用copy。

      >>> temp =[]
      >>> temp.append(123)
      >>> temp.append(10)
      >>> temp.append(18)
      >>> mutR =[]
      >>> import copy
      >>> mutR.append(copy.copy(temp))
      >>> print mutR
      [[123, 10, 18]]
      >>> temp[:]=[]
      >>> temp.append(3)
      >>> temp.append(4)
      >>> temp.append(5)
      >>> mutR.append(temp)
      >>> print mutR
      [[123, 10, 18], [3, 4, 5]]
      

      【讨论】:

        【解决方案3】:

        给你

        >>> temp =[]
        >>> temp.append(123)
        >>> temp.append(10)
        >>> temp.append(18) 
        >>> mutR =[temp]
        >>> print(mutR)
        [[123, 10, 18]]
        >>>
        >>>
        >>> temp=[]
        >>> temp.append(3)
        >>> temp.append(4)
        >>> temp.append(5)
        >>> mutR.append(temp)
        >>> print(mutR)
        [[123, 10, 18], [3, 4, 5]]
        

        【讨论】:

          【解决方案4】:

          您正在寻找extend 方法。

          >>> l = [1, 2, 3]
          >>> l.extend([4, 5, 6])
          >>> print l
          [1, 2, 3, 4, 5, 6]
          

          【讨论】:

          • 这有帮助,但我想保持这样的括号 [[1,2,3],[4,5,6]]。我想这样使用它 l[0] (=[1,2,3]), l[1] (=[4,5,6])
          【解决方案5】:

          您需要分配temp[]=[] 而不是temp[:]=[]

          另请参阅:Python list slice syntax used for no obvious reason

          【讨论】:

            【解决方案6】:

            在 Python 中几乎没有任何东西会复制,除非它明确说明它会复制。特别是,append 不会复制;您附加的对象的任何更改都将反映在您附加到的列表中,因为该列表包含对原始对象的引用。

            为避免此类问题,请不要在需要新对象时清除现有对象。相反,创建一个新对象:

            temp = []
            

            而不是

            temp[:] = []
            

            我想如果你真的想清除原来的temp 列表而不是替换它,你可以在追加时复制一份:

            mutR.append(temp[:])
            

            【讨论】:

              【解决方案7】:

              mutR.append(temp) 将 temp 附加到 mutR,temp[:]=[] 使 temp 再次成为一个空列表,mutR 中的 temp 也成为一个空列表,因为它是一个 reference到temp 不是 副本。

              然后您将三个元素附加到空 temp 并添加 temp 到 mutR 和 mutR.append(temp),这样您的列表中有两个 references 到 temp。

              最初使用mutR.append(temp[:]) # <- copy of temp not a reference 将temp 的副本添加到mutR,因此以后对 temp 的更改不会影响它。

              In [6]: mutR.append(temp[:])   # copy temp  
              In [7]: temp[:]=[]    
              In [8]: temp.append(3)    
              In [9]:  temp.append(4)    
              In [10]: temp.append(5)    
              In [11]: mutR.append(temp)    
              In [12]: mutR
              Out[12]: [[123, 10, 18], [3, 4, 5]]
              

              【讨论】:

              • 我更喜欢显式调用 copy.copy 或 copy.deepcopy 而不是使用切片来创建新对象
              • @AdamSmith,这个看个人喜好,处理单个列表时没必要
              猜你喜欢
              • 1970-01-01
              • 2021-06-19
              • 1970-01-01
              • 1970-01-01
              • 2021-11-14
              • 2021-11-13
              • 2014-06-07
              • 2019-03-29
              • 1970-01-01
              相关资源
              最近更新 更多