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

使用类结合numpy异常:修改单个实例属性致所有实例同步变更

问题原因分析

你遇到的问题核心是类属性与实例属性的混淆:

  • 你在Corner类中直接定义的centres = np.zeros((3,2))属于类属性,所有Corner实例会共享同一个centres数组对象。修改任意一个实例的centres,本质是修改了这个共享的类属性,所有实例自然会同步变化。
  • 而id=0虽也是类属性,但后续你通过corner.id = i给每个实例单独赋值,这相当于给实例创建了同名的实例属性,覆盖了类属性,所以id不会出现共享问题。
解决方法

把centres改为实例属性,在类的__init__方法中初始化,确保每个实例拥有独立的数组:

import numpy as np

class Corner():
    def __init__(self, id=0):
        self.centres = np.zeros((3,2))  # 每个实例单独初始化独立数组
        self.id = id

# 更简洁的实例创建方式
corners = [Corner(i) for i in range(4)]

# 测试修改
corners[1].centres[0] = [5,5]
print(corners[0].centres)  # 输出全0,不受修改影响
print(corners[1].centres)  # 第一个元素为[5,5]
对比Numpy数组的差异

你直接用corners=np.zeros((4,3,2))创建的是三维Numpy数组,其中每个corners[i]是大数组的一个子视图。修改子视图时,Numpy会准确定位到对应内存区域,不会影响其他子视图——因为整个数组是连续内存块,索引操作只是指向不同区域,不存在共享同一个对象的问题。

内容的提问来源于stack exchange,提问作者user1069353

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 18:12:08