【问题标题】:Appending Items by Iterating list通过迭代列表附加项目
【发布时间】:2015-03-03 06:09:41
【问题描述】:

我设计了以下函数,它接受一个列表作为参数并返回另一个列表。

def function(list):
    A = []
    B = []
    for num in list:
        A.append(num)
        B.append(A)
    return B

在这个函数中,我假设该函数会根据 A 的当前状态将 A 附加到 A。在该假设下工作。我调用了函数

>>> test([1,2,3,4,5])

预期的输出是

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

但是,我得到的结果是

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

这是为什么?有没有解决这个问题的办法?

【问题讨论】:

  • 你正在做的是通过引用 A 的地址而不是 A 的值内容。因此最后它显示了 A 的重复内容,而不是显示它们存储时的值。基本的pythonic方法..正如@Paul Lo所建议/回答的那样。不,这不是问题,而是基本的python“属性”

标签: python list python-3.x for-loop


【解决方案1】:

您需要按值复制它。在您目前的情况下,您是通过引用传递的。因此,每个索引都会随着A 的变化而更新。应该是:

    B.append(A[:])

注意[:] 按值复制。

为了澄清,running your code here 我们可以检查在[1,2] 上调用function 的结果:

现在,考虑一下我们制作副本时会发生什么:

def function(list):
    A = []
    B = []
    for num in list:
        A.append(num)
        B.append(A[:])
    return B

print function([1,2])

另外,附带说明:您应该更改变量的名称。例如,通过将参数声明为list,您可以隐藏list 方法。

【讨论】:

  • 在短时间内完成了多么精彩又详细的教程!
  • @PaulLo:谢谢。 :) 但是大部分功劳应该归功于那些制作了让这些图片很容易可视化的漂亮程序的人! (www.pythontutor.com)
【解决方案2】:

您可以将A 的副本附加到B 以避免使用A 的相同引用:

for num in list:
      A.append(num)
      B.append(A[:])

【讨论】:

    【解决方案3】:

    列表通过引用传递。要复制它们,请使用语法B.append(A[:])

    def function(list):
        A = []
        B = []
        for num in list:
            A.append(num)
            B.append(A[:])
        return B
    

    【讨论】:

      【解决方案4】:

      在您的代码中,您发送的是参考而不是数据。

      工作代码

      def function(list):
         A = []
         B = []
         for num in list:
            A.append(num)
            B.append(A[:])
         return B
      

      【讨论】:

        猜你喜欢
        • 2020-10-04
        • 1970-01-01
        • 1970-01-01
        • 2020-11-23
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 2014-09-06
        相关资源
        最近更新 更多