按值传递可变对象

Pass mutable object 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)

有没有办法告诉口译员我想'pass by value'?我能够从追加之前的行的状态构造一个元组或可变的东西,并在列表中附加元组。我只想检查这是最好的解决方案。

它不是 "passing by value",因为列表实际上包含对对象的引用。 您需要创建 copy 并附加到列表,即:

state_list.append(state.copy())

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

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