类方法内外的matrix变量值为何不同?
问题解答
是的,这正是导致你看到不同结果的原因!
核心原因:NumPy数组是可变对象,赋值传递的是引用
在Python里,像NumPy数组、列表这类可变对象,当你执行matrix = self.A时,并不是把self.A的内容复制一份给matrix,而是让matrix和self.A指向内存里的同一个数组对象——说白了,它们就是同一个东西的两个“别名”而已。
所以当你后续修改self.A的时候,本质上是在修改内存中那个唯一的数组,matrix作为自然也会跟着变化。你在类内部打印时,修改还没发生;等外部打印时,self.A已经被改动,matrix指向的也是修改后的数组,结果自然不一样。
结合你的代码来看
我先把你的代码修正了语法错误,方便更清晰地理解逻辑:
import numpy as np def function(): obj = X() print(matrix) # 外部打印:此时self.A已被后续修改,matrix同步变化 class X(): def __init__(self): # 假设self.words和self.wdict是已定义的变量 self.A = np.zeros([len(self.words), self.dcount]) for i, k in enumerate(self.words): for d in self.wdict[k]: self.A[i,d] += 1 global matrix matrix = self.A print(matrix) # 类内部打印:此时self.A还没被后续修改 # 这里开始对self.A做一些修改操作 # ... if __name__ == "__main__": function()
你在__init__里把matrix指向self.A,之后修改self.A的操作会直接影响matrix,因为它们指向同一个数组。
解决方法:创建数组的独立副本
如果你想让matrix保持self.A赋值时的状态,不受后续修改影响,需要创建一个数组的副本,而不是直接赋值引用。用NumPy数组自带的copy()方法就可以:
matrix = self.A.copy() # 替代原来的 matrix = self.A
这样matrix就会指向一个全新的数组对象,和self.A完全独立,后续修改self.A就不会再影响matrix了。如果你的数组是嵌套的复杂结构,也可以用np.deepcopy(),不过普通一维/二维NumPy数组用copy()就足够。
内容的提问来源于stack exchange,提问作者Tripoli
相关产品推荐
相关产品推荐

