You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:27:03