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

类方法内外的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:39:42