Python 按值传递可变对象

Python 按值传递可变对象,python,pass-by-reference,pass-by-value,Python,Pass By Reference,Pass By Value,我在for循环中修改状态字典,并在每次迭代中将新状态附加到列表中 在Python中,字典当然是可变的,因此添加到列表中的是对不断变化的字典对象的引用。最后,我得到了一个相同重复引用的列表,指向状态的最终版本 state = {'temp': 21.6, 'wind': 44.0} state_list = [] for i in range(10): state['temp'] += 0.5 state['wind'] -= 0.5 state_list.append(s

我在for循环中修改状态字典,并在每次迭代中将新状态附加到列表中


在Python中,字典当然是可变的,因此添加到列表中的是对不断变化的字典对象的引用。最后,我得到了一个相同重复引用的列表,指向状态的最终版本

state = {'temp': 21.6, 'wind': 44.0}
state_list = []
for i in range(10):
    state['temp'] += 0.5
    state['wind'] -= 0.5
    state_list.append(state)
有没有办法告诉解释器我希望“按值传递”?我能够从追加前一行的状态构造一个元组或一些可变的东西,并用say tuples追加列表。我只是想检查一下这是最好的解决方案

它不是“按值传递”,因为列表实际上包含对对象的引用。 您需要创建并附加到列表,即:

state_list.append(state.copy())
注意,
.copy
创建对象的浅拷贝。对于容器,这意味着容器是新的,但它将包含相同的引用。由于您的状态是由float描述的,并且float是不可变的,所以这不会引起任何问题


如果您需要复制内部包含可变对象的容器,并复制此对象,您可以使用

,以防dictionary对象是OP实际操作的简化表示,值得注意的是,
copy
deepcopy
之间的区别:否。您必须显式复制。“所以最后我得到了一个相同重复引用的列表,指向状态的最终版本”实际上,列表中的所有元素都是相同的dict,句号。