如何在Python中通过引用传递值?

3

基本上我正在使用一个应用程序的C++ API,但是没有关于其Python访问的参考。有一个变量是通过引用传递的,就像这样:

GetPoint ( Point  &p, Object obj )

那么我该如何将其翻译成Python呢?是否有传递引用的符号?


与此相关的问题及其相关答案:https://dev59.com/3nRB5IYBdhLWcg3wuZbo - Dana
谢谢,我忘了那个。 - Joan Venge
1
我知道这是一个老问题,但对于未来的读者:当使用Python与其他语言的API时,您应该能够直接访问成员,而不是使用getter和setter。如果Python绑定很好,那么属性实际上将是属性,并且您将通过访问器重定向而不知道它。Getter和setter不是非常pythonic,因此在使用wxPython或Jython中的Swing时,我已经明确表示不使用它们。 - Cam Jackson
5个回答

5

Python中没有传递引用符号。

只需修改传入的指针,您所做的修改将在调用函数中可见。

>>> def change(obj):
...     obj.x = 10
...
>>> class Point(object): x,y = 0,0
...
>>> p = Point()
>>> p.x
0
>>> change(p)
>>> p.x
10

...

所以我应该这样传递:GetPoint(p, obj)?

是的,虽然Iraimbilanja提出了一个很好的观点。绑定可能已经改变了调用方式,返回点而不是使用out参数。


Python有全局变量,这些变量对类和其他函数可见。它有内部于类的变量,这些变量由构造_self方法初始化。Python有局部变量。Python在子类化方法中有私有变量。使用复制将数据从一个变量创建一个新实例到另一个变量。 - Golden Lion

3
很可能你的Python绑定已经将该签名转换为:
Point GetPoint(Object obj)

甚至更多:
Point Object::GetPoint()

那么请查看绑定的文档或源代码。


谢谢,返回值是一个布尔类型的状态,但必须传递点,否则会抛出参数数量错误的异常。 - Joan Venge

2
我相当肯定Python传递给变量的是引用的值。这篇文章可能比我更好地解释了它。

1

在Python中,对象始终作为引用传递。因此,将其封装在对象中会产生类似的效果。


这是正确的答案。Python对象总是以相同的方式传递(按引用)。一些对象(例如整数)是不可变的,并给出了按值传递的印象... 不,它总是以相同的方式进行... 永远! :-) - Salim Fadhley

1

在Python中没有符号引用 - 正确的做法取决于您的API。要问自己的问题是谁拥有从C ++传递到Python的对象。有时,最简单的方法就是将对象复制到Python对象中,但这可能并不总是最好的选择。

您可能会对boost.python感兴趣 http://www.boost.org/doc/libs/1_38_0/libs/python/doc/index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接