代码之家  ›  专栏  ›  技术社区  ›  jsstuball

按值传递可变对象

  •  3
  • jsstuball  · 技术社区  · 7 年前

    我在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)
    

    有没有办法告诉解释器我希望“按值传递”?我能够从append之前的状态行构造一个元组或一些可变的东西,并用say元组来追加列表。我只是想检查一下这是最好的解决方案。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Slam    7 年前

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

    state_list.append(state.copy())
    

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

    如果您需要复制内部包含可变对象的容器,并且也要复制这些对象,那么可以使用 deepcopy