【问题标题】:value covers pervious value using append() in python [duplicate]在 python 中使用 append() 覆盖先前的值 [重复]
【发布时间】:2018-04-07 07:16:12
【问题描述】:

我正在尝试使用 append 函数创建一个嵌套列表,但最后一个值将恢复以前的值,任何人都可以告诉我为什么,以及如何正确地做到这一点。 谢谢

d= []
temp = [0,0,0]
for i in range(4):
   temp[0] = i+1
   d.append(temp)

输出显示:

[[4, 0, 0], [4, 0, 0], [4, 0, 0], [4, 0, 0]]

但我想要的输出是

[[1, 0, 0], [2, 0, 0], [3, 0, 0], [4, 0, 0]]

【问题讨论】:

    标签: python


    【解决方案1】:

    试试这个:

    d= []
    temp = [0,0,0]
    for i in range(4):
       tmp = [t for t in temp]
       tmp[0] = i+1
       d.append(tmp)
    

    【讨论】:

    • [t for t in temp] 是一种相当冗长/缓慢的方式来表达temp[:]。无操作 listcomp 总是比空切片更好,someseq[:],或者如果输入可能不是 list 而输出必须是 listlist(someseq)
    • 非常感谢
    • 不客气
    【解决方案2】:

    您的结果列表是[temp, temp, temp, temp]。如果您希望对象不同,则每次都必须创建一个新的子列表。使用列表推导的一种简单方法是

    d = [[i, 0, 0] for i in range(1, 5)]
    

    【讨论】:

    • 或者,使用 OP 的代码,只需将 d.append(temp) 更改为 d.append(temp[:]),每次使用“空切片”插入 temp 的浅表副本,而不是它的另一个别名。您的列表理解更快速、更清晰,浅拷贝只是最小的修复。
    • 非常感谢您的回答。
    猜你喜欢
    • 2022-01-24
    • 1970-01-01
    • 2021-09-05
    • 2019-09-24
    • 1970-01-01
    • 2015-07-30
    • 2016-04-25
    • 1970-01-01
    相关资源
    最近更新 更多