【问题标题】:Value changes in new list impact previous list values, within a list of lists [duplicate]新列表中的值更改会影响列表列表中的先前列表值[重复]
【发布时间】:2015-11-01 15:29:30
【问题描述】:

我希望随机生成一个列表并更改列表中的一个元素以创建一个新列表。同时跟踪所有生成的列表。

例如:

values_possible = [0,0.5,1]
combinations = []
combinations.append([random.choice(values_possible) for i in range(8)])

让我们说这会产生

[0,0.5,0.5,0,0.5,0.5,1.0,1.0]    

如果我复制这个列表并更改一个元素,比如组合[1][1]

# set a new list to equal the first and then change one element
combinations.append(combinations[0])
combinations[1][1] = 0.33

print(combinations[0])
print(combinations[1])

返回

[0,0.33,0.5,0,0.5,0.5,1.0,1.0]
[0,0.33,0.5,0,0.5,0.5,1.0,1.0]

似乎combinations[0][1] 和combinations[1][1] 都变成了0.33。有没有办法解决这个问题?请问为什么会发生这种情况以及我对列表有什么误解?我期望得到以下输出:

[0,0.5,0.5,0,0.5,0.5,1.0,1.0]
[0,0.33,0.5,0,0.5,0.5,1.0,1.0]

【问题讨论】:

  • combinations.append([random.choice(values_possible) for i in range(8)]) 生成[[0,0.5,0.5,0,0.5,0.5,1.0,1.0]]。那是因为append 将一个元素附加到列表中。在这种情况下,元素是一个列表。请改用.extend,否则,如果这是您想要得到的,请更正错字并在生成的列表周围添加[ ]

标签: python list


【解决方案1】:

您的问题的简短回答是使用冒号:

 combinations.append(combinations[0][:])

为什么?原因是在 python 中,当您将变量附加到列表中时,该变量将由其 reference 附加。在您的示例中,这意味着列表中的两个元素是相同的。它们指向内存中的相同地址,如果您修改其中任何一个,两个值都会改变,因为它们是一个并且使用相同的内存块。

如果您想复制变量的值,在您的情况下是组合[0],您需要使用冒号来复制值并将它们放在内存的另一部分(会占用另外一块不同地址的内存)这种情况下可以单独修改。

你也可以看看这个问答:python list by value not by reference

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    使用

    combinations.append(list(combinations[0]))
    

    附加第一个元素的副本

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多