如何使用C/C++;全局变量是用python实现的吗?

如何使用C/C++;全局变量是用python实现的吗?,python,swig,Python,Swig,当我阅读SWIG文档时,我读了以下几行 SWIG完全支持C/C++全局变量。然而,由于Python赋值的工作方式,底层机制与您可能期望的有所不同。在Python中键入以下内容时 a=3.4 “a”成为包含值3.4的对象的名称。如果您稍后键入 b=a 那么“a”和“b”都是包含值3.4的对象的名称。因此,只有一个对象包含3.4,“a”和“b”都是引用它的名称。这与C完全不同,C中的变量名指存储值的内存位置(赋值将数据复制到该位置)。因此,没有直接的方法将C中的变量赋值映射到Python中的变量赋值

当我阅读SWIG文档时,我读了以下几行

SWIG完全支持C/C++全局变量。然而,由于Python赋值的工作方式,底层机制与您可能期望的有所不同。在Python中键入以下内容时
a=3.4
“a”成为包含值3.4的对象的名称。如果您稍后键入
b=a
那么“a”和“b”都是包含值3.4的对象的名称。因此,只有一个对象包含3.4,“a”和“b”都是引用它的名称。这与C完全不同,C中的变量名指存储值的内存位置(赋值将数据复制到该位置)。因此,没有直接的方法将C中的变量赋值映射到Python中的变量赋值。
为了提供对C全局变量的访问,SWIG创建了一个名为“cvar”的特殊对象,该对象添加到每个SWIG生成的模块中。然后将全局变量作为该对象的属性进行访问

我的问题是,以上述方式实施的必要性是什么。尽管我们以上述方式实现了对象属性,但对象属性也被实现为对象

请参阅下面的python代码片段

a = 10  
b = a  
a is b  
True  

class sample: 
    pass   

obj = sample()  
obj.a = 10  
obj.b = obj.a  
obj.a is obj.b  
True  

在上述两种情况下,对象分配以相同的方式进行,这都是因为SWIG必须提供一个与C/C++中的库的接口,而该接口的作用不同

让我们假设SWIG没有实现
cvar
对象,而是简单地使用
PyInt
s等作为生成模块的属性(这是“普通”C扩展所做的)。 然后,当用户从python代码向变量赋值时,一个新的
PyInt
对象被赋值给该属性,但库使用的原始变量保持不变,因为模块对象不知道在赋值时必须修改C全局变量

这意味着,虽然从python端用户将看到值的更改,但C库不会意识到更改,因为全局变量表示的内存位置没有更改其值

为了允许用户以从C/C+库可见的方式设置值,SWIG必须定义此
cvar
对象,该对象在执行赋值时,将值分配给封面下的库变量,即它更改包含全局变量值的内存位置的内容


这可能是通过提供
\uuuuu setattr\uuuuu
\uuuuu getattr\uuuuu
\uuuuuu getattribute\uuuuuu
的实现来实现的,这样
cvar
就能够覆盖属性赋值的行为。

您的问题到底是什么?这是Python的典型特征。@AleksanderLidtke那么为什么他将全局变量实现为“cvar”对象的属性,而不是直接实现为Python变量她说为什么:
为了提供对C全局变量的访问,SWIG创建了一个名为“cvar”的特殊对象这被添加到每个SWIG生成的模块中。
我认为您发布的所有文档片段的底线是:
变量在C中的实现方式与在Python中的实现方式不完全相同,因此需要有一个桥梁,以某种方式使它们结合在一起,这就是
cvar
。这很好。我是说这座桥也有同样的作用。那么“cvar”对象的需求是什么呢?你能告诉我c/c++中的指针是如何在swig中实现的吗?我读了文档,但没有给出任何关于implementation@user1218927我不是SWIG专家,我只是或多或少地了解python C/API的工作原理。浏览文档寻找SWIG的指针,我没有看到任何特别的东西。SWIG将指针视为“不透明值”,即,除了将指针传递给库的其他函数外,您不能(几乎)从python对指针执行任何操作。为了工作,这些值包含有关“指针编码”及其类型的信息。无论何时将其传递给函数,函数都可以检查类型是否正确,并最终获得指向正确内存位置的指针。