Python如何避免列表内对象相互关联(修改一个全列表同步变更)
问题根源
你所有错误的核心是混淆了类本身和类的实例对象,你全程操作的都是State类本身,而非生成独立的类实例,自然所有修改都会全局同步。
具体错误说明
- 写
State得到的是类本身,全局只有一份,只要修改State.angle所有引用这个类的地方都会同步变更 - 只有调用构造方法
State(参数1, 参数2)才会生成一个全新的、独立的State实例,不同实例之间的属性修改互不影响 - 你在初始化
StateSettings、ListOfStates时也多次出现没有实例化、参数类型不匹配的问题
修正后可运行代码
from typing import List, Tuple class State: # 把State看作某种坐标类 def __init__(self, z:float, angle:float): self.z = z self.angle = angle class ListOfStates: # 该对象需要包含多个互不关联的State实例 def __init__(self, list_of_states : List[State]): self.list_of_states = list_of_states class StateSettings: # 上层封装对象 def __init__(self, state : State, list_of_states : ListOfStates): self.state = state self.list_of_states = list_of_states some_number = 42 # 正确初始化逻辑 if __name__ == "__main__": # 1. 先生成42个独立的State实例,初始z和angle可以先设为0 state_list = [State(z=0, angle=0) for _ in range(some_number)] # 2. 把State列表包装为ListOfStates实例 list_of_states = ListOfStates(list_of_states=state_list) # 3. 初始化顶层StateSettings实例 state_settings = StateSettings( state=State(z=0, angle=0), list_of_states=list_of_states ) # 4. 遍历修改每个独立实例的angle属性 for i in range(some_number): state_settings.list_of_states.list_of_states[i].angle = i # 测试输出 print(state_settings.list_of_states.list_of_states[0].angle) print(state_settings.list_of_states.list_of_states[1].angle) print(state_settings.list_of_states.list_of_states[2].angle)
输出结果
0 1 2
所有实例的属性已经独立,修改不会互相影响。
内容的提问来源于stack exchange,提问作者Martin
相关产品推荐
相关产品推荐

