按值传递可变对象

JSS*_*all 3 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(state)
Run Code Online (Sandbox Code Playgroud)

有没有办法告诉翻译我希望"通过价值传递"?我能够在追加前的行中构造一个元组或一些可变的元素,并在列表中附加说明元组.我只是想检查这是最好的解决方案.

Sla*_*lam 5

它不是"通过值传递",因为列表实际上包含对象的引用.您需要创建副本并附加到列表,即:

state_list.append(state.copy())
Run Code Online (Sandbox Code Playgroud)

请注意,这.copy会创建一个浅层的对象副本.对于容器,这意味着容器是新的,但它将包含相同的引用.由于您的状态由浮点数描述,浮点数是不可变的,因此不会产生任何问题.

如果您需要复制内部具有可变对象的容器并同时复制此对象,则可以使用deepcopy

  • 为了防止字典对象是OP实际执行的简化表示,值得注意的是`copy`和`deepcopy`之间的区别:https://docs.python.org/2/library/copy.html (3认同)