使用类结合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
相关产品推荐
相关产品推荐

