【问题标题】:Python - appending one list to anotherPython - 将一个列表附加到另一个列表
【发布时间】:2014-04-26 23:03:35
【问题描述】:

在我的项目中,我的代码有点难以平静,但它的行为方式与这个完全一样:

seq = []
a = []

for i in range(3):
    a[:] = []
    a.append(i)
    a.append(i)

    seq.append(a)
    print seq

它作为输出给出:

[[0, 0]]

[[1, 1], [1, 1]]

[[2, 2], [2, 2], [2, 2]]

虽然我希望它是:

[[0, 0]]

[[0, 0], [1, 1]]

[[0, 0], [1, 1], [2, 2]]

我做错了什么?

【问题讨论】:

    标签: python list


    【解决方案1】:

    a 的初始化移动到循环内,目前您正在一次又一次地将相同的列表对象附加到seq

    for i in range(3):
        a = []       #or simply a = [i] * 2
        a.append(i)
        a.append(i)
    
        seq.append(a)
        print seq 
    

    如果您在程序结束时打印 seq 中项目的 id(),您将得到相同的 id()。所以,它们都是对同一个列表对象的引用:

    print [id(x) for x in seq]
    #[1095704328L, 1095704328L, 1095704328L]
    
    In [106]: a = []
    
    In [107]: seq = [a, a, a]
    
    In [108]: a.append(1)
    
    In [109]: seq
    Out[109]: [[1], [1], [1]]
    
    In [110]: a.append(2)
    
    In [111]: seq
    Out[111]: [[1, 2], [1, 2], [1, 2]]
    

    【讨论】:

    • 您好!感谢您的回复,现在它完美无缺。最后一个问题,这部分不是:a[:] = [] 使我的列表为空吗?我确信在循环中我正在清除列表,向其中添加一些数据,然后将其附加到主列表中。
    • @Desprit 你肯定在清空它,但它仍然指向同一个对象。您需要做的是创建一个新的列表对象。还可以在这里阅读我的其他答案:What is the difference between a[:]=b and a=b[:]
    • @Desprit 您可以做的另一件事是附加a:seq.append(a[:]) 的浅表副本,但最好在此处创建一个新的列表对象。
    • 感谢先生提供链接和解释所有这些是如何工作的!必须再次阅读有关链接的原因...这是一个愚蠢的错误)
    • 哦,我尝试 +1,但由于声誉原因我不能 ^^ 认为接受也是如此。
    【解决方案2】:

    试试下面的代码:

    seq = []
    a = []
    
    for i in range(3):
        a = []
        a.append(i)
        a.append(i)
    
        seq.append(a)
        print seq
    

    运行如下:

    >>> a = []
    >>> seq = []
    >>> for i in range(3):
    ...     a = []
    ...     a.append(i)
    ...     a.append(i)
    ...     seq.append(a)
    ...     print seq
    ... 
    [[0, 0]]
    [[0, 0], [1, 1]]
    [[0, 0], [1, 1], [2, 2]]
    >>> 
    

    您的问题是,即使您附加了不同的值,在您更改 a 后,seq 中的值也会发生变化。

    【讨论】:

    • 没问题,记得 +1 和/或接受对您有帮助的答案!
    • 已接受但无法 +1,抱歉!
    • 没问题,现在你确实有足够的声望了,:)
    猜你喜欢
    • 1970-01-01
    • 2015-07-11
    • 2020-10-29
    • 1970-01-01
    • 1970-01-01
    • 2018-01-13
    • 2021-03-17
    • 2022-10-25
    • 1970-01-01
    相关资源
    最近更新 更多