首页 > 解决方案 > 更改类中的变量会导致全局变量也发生更改?

问题描述

这是代码:

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会发生变化?我没有为它分配新值。

我能做些什么来避免这个问题再次出现?

谢谢!

标签: pythonpython-3.xnumpy

解决方案


在 Python 中,没有“按引用传递”或“按值传递”的概念。一切都是“名副其实”。也就是说,传递可变对象和不可变对象是有区别的。

您将 global weights(一个可变对象)传递给类构造函数。因为它是可变的,所以它有点类似于通过引用传递。修改对象的范围无关紧要。无论您使用类范围内的self.weights_new名称( )还是全局范围内的名称(weights),对象都是一样的。

如果您改为传递和修改像元组这样的不可变对象,它将表现得更像“按值传递”。


推荐阅读