Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-在不同类的不同实例之间共享变量_Python_Pass By Reference - Fatal编程技术网

Python-在不同类的不同实例之间共享变量

Python-在不同类的不同实例之间共享变量,python,pass-by-reference,Python,Pass By Reference,我一直在寻找下一个答案,但肯定我一直在搜索错误的关键字。 我以前用C++开发,把指针作为对象之间的引用。情况是,现在我尝试用Python构建一个程序,其中一个类“General”的实例使用相同的共享变量初始化一个类“Specific”的不同实例 class General(): def __init__(self): self._shared_variable = 0 self._specific1 = Specific(self._shared_vari

我一直在寻找下一个答案,但肯定我一直在搜索错误的关键字。 我以前用C++开发,把指针作为对象之间的引用。情况是,现在我尝试用Python构建一个程序,其中一个类“General”的实例使用相同的共享变量初始化一个类“Specific”的不同实例

class General():
    def __init__(self):
        self._shared_variable = 0
        self._specific1 = Specific(self._shared_variable)
        self._specific2 = Specific(self._shared_variable)

class Specific():
    def __init__(self, shared):
        self._shared = shared
    def modify_shared_variable(self):
        self._shared_variable +=1

所以我要做的是在de-General范围内共享这个
'shared\u variable'
,所以当一个“特定”实例修改其内部变量时,这个更改会被另一个实例看到或镜像。但python中并非如此。因此,每个特定实例都有自己的变量。如何实现这一点?

在Python中不能引用变量。变量只是某个名称空间(通常是模块、类或实例对象的
\uuuuu dict\uuuu
,或函数调用框架内的特殊本地名称空间)中的值的名称

可以引用值,但数字当然是不可变的值,因此不能将数字1更改为数字2

所以,你能做的就是创建一个可变的值来保存这个数字,并共享对它的引用


一种明显的可能性是只给每个
特定的
实例一个对创建它的
常规
实例的引用:

class General():
    def __init__(self):
        self._shared_variable = 0
        self._specific1 = Specific(self)
        self._specific2 = Specific(self)

class Specific():
    def __init__(self, shared_general):
        self._shared_general = shared_general
    def modify_shared_variable(self):
        self._shared_general._shared_variable +=1

另一种可能是存储单个元素列表:

class General():
    def __init__(self):
        self._shared_variable = [0]
        self._specific1 = Specific(self._shared_variable)
        self._specific2 = Specific(self._shared_variable)

class Specific():
    def __init__(self, shared):
        self._shared = shared
    def modify_shared_variable(self):
        self._shared[0] += 1

(这是你在C++中所做的事情,但是没有数组的语法糖,指针几乎是一样的东西……)



或者,您可以创建一个简单的
MutableInteger
类,该类保存
int
,代理非变异方法,添加
set
方法替换它,并通过调用
set
并返回
self
,而不是返回新值来处理
+=
和其他变异方法。

Hi@谢谢你的快速回答。我采用了第三种方法,效果很好!。你认为最好的做法是什么?谢谢大家!@这真的取决于你在做什么。就我个人而言,我很少使用像“int-holder”这样不太具体的东西,比如“user-object”(它碰巧没有字段,只有一个int-user-id),但这并不意味着它没有很好的用途。只要你考虑“如何在Python中建模数据”的术语而不是“如何将这个C++模型转换为Python模型”,你的直觉可能会很好。