python - 更改类中的变量会导致全局变量也发生更改?
问题描述
这是代码:
import numpy as np
weights = np.array([[2.,3.,4.],[5.,6.,7.,]])
class TTESt:
def __init__(self,weight_new):
self.weight_new = weight_new
def changeweights(self):
temp = np.zeros(shape = (2,3))
temp_weights = self.weight_new
temp_weights[0,0] = 1000.
return temp_weights
aaa = TTESt(weights)
aaa.changeweights()
print(weights)
我期望的输出print(weights)
是np.array([[2.,3.,4.],[5.,6.,7.,]])
(仍然是它自己)。
但事实并非如此。
这段代码的输出是:
[[1000. 3. 4.]
[ 5. 6. 7.]]
[[1000. 3. 4.]
[ 5. 6. 7.]]
为什么全局变量weights
会发生变化?我没有为它分配新值。
我能做些什么来避免这个问题再次出现?
谢谢!
解决方案
在 Python 中,没有“按引用传递”或“按值传递”的概念。一切都是“名副其实”。也就是说,传递可变对象和不可变对象是有区别的。
您将 global weights
(一个可变对象)传递给类构造函数。因为它是可变的,所以它有点类似于通过引用传递。修改对象的范围无关紧要。无论您使用类范围内的self.weights_new
名称( )还是全局范围内的名称(weights
),对象都是一样的。
如果您改为传递和修改像元组这样的不可变对象,它将表现得更像“按值传递”。
推荐阅读
- wordpress - AWS S3 RSS 源
- typescript - 单元测试:TypeError:无法读取未定义的属性“管道”
- python-3.x - 将加权列表添加在一起
- java - 无法模拟 ReactriveJWTDecoder
- angular - 动态导航栏和 Angular 4 路由
- spring-boot - 使用ansible自动更新spring boot docker app
- unit-testing - Nestjs中的单元测试ClientProxy
- database - Azure 中具有快速更新选项的超大型数据集的最佳存储
- php - 从大小不同的字符串的多个部分获取文本并将它们转换为变量
- java - Java 8 到 11 迁移 - URL 解析不再起作用