我希望随机生成一个列表并更改列表中的一个元素以创建一个新列表。同时跟踪所有生成的列表。
例如:
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]
似乎组合[0] [1]和组合[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]
答案 0 :(得分:2)
您的问题的简短回答是使用冒号:
yard
为什么呢?原因是在python中将变量追加到列表中时,变量会附加其引用。在您的示例中,这意味着列表中的两个元素是相同的。它们指向内存中的相同地址,如果您修改它们中的任何一个,则两个值都会因为它们而改变并使用相同的内存块。
如果你想复制变量的值,在你的情况下,使用组合[0],你需要使用冒号来复制值并将它们放在内存的另一部分(它将占用另一块具有不同地址的内存)在这种情况下,您可以单独修改它们。
您还可以查看此问题并回答:python list by value not by reference
我希望这会有所帮助。
答案 1 :(得分:1)
使用
combinations.append(list(combinations[0]))
附加第一个元素的 副本 。