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

Python(Jupyter)中等号赋值致右侧变量后续被修改的问题

问题分析:Numpy矩阵赋值后修改副本影响原变量的原因及解决办法

嘿,这个坑我当初刚用numpy的时候也踩过!先来看下你的代码和核心现象:

你的代码

import numpy as np
i=2
j=0
basis = np.matrix([False,False,True,True,True])
basis_mod = basis
print "basis"
print basis
print "basis_mod"
print basis_mod
basis_mod[:,i] = False
print "basis"
print basis
print "basis_mod"
print basis_mod
basis_mod[:,j] = True
print "basis"
print basis
print "basis_mod"
print basis_mod

控制台关键输出

basis
[[False False True True True]]
basis_mod
[[False False True True True]]
...
修改后basis和basis_mod的内容完全同步变化


为什么会出现这种情况?

这是因为Numpy的矩阵(以及数组)在赋值时是引用传递,而非值拷贝!

当你执行basis_mod = basis时,并没有生成一个新的矩阵对象,只是让变量basis_mod和basis指向了内存中同一个矩阵实例。打个通俗的比方:就像给同一个房间装了两扇门,不管从哪扇门进去改动房间里的东西,从另一扇门进去看到的都是修改后的状态。

这种设计是为了节省内存、提升处理效率——毕竟numpy经常用来处理大规模数据,如果每次赋值都拷贝整个数组,开销会非常大,但也容易让新手误以为是普通的“值赋值”操作。


解决办法:创建真正的独立副本

要让basis_mod成为和原矩阵无关的独立对象,修改它不影响basis,你需要显式创建副本,常用的方法有这几种:

1. 使用矩阵的.copy()方法(最推荐)

直接在原矩阵上调用.copy(),会生成一个完全独立的新矩阵:

import numpy as np
i=2
j=0
basis = np.matrix([False,False,True,True,True])
basis_mod = basis.copy()  # 核心修改:用copy创建副本
print "basis"
print basis
print "basis_mod"
print basis_mod
basis_mod[:,i] = False
print "修改后basis:"
print basis
print "修改后basis_mod:"
print basis_mod

执行这段代码后,你会发现basis始终保持初始值,只有basis_mod被修改。

2. 使用np.copy()函数

和上面的方法效果一致,写法稍有不同:

basis_mod = np.copy(basis)

3. 转换为数组后拷贝(可选)

如果需要更灵活的操作,也可以先转成numpy数组再拷贝,最后转回矩阵:

basis_mod = np.matrix(np.array(basis).copy())

这样修改后,两个变量就指向不同的内存对象了,各自的修改操作再也不会互相影响~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:36:07