在python中通过引用传递引用

时间:2014-02-17 10:24:10

标签: python c++ pointers pass-by-reference

在python中是否可以通过引用传递引用?在C ++中,传递数据的python模型可以通过传递指向数据的指针来模仿:指针通过值传递,函数可以改变它指向的任何东西,但函数不能改变指针的值。但是,在C ++中,您还可以传递对指针的引用,在这种情况下,您可以修改指针值以及它指向的内容。

我想到的是以下C ++片段的类比,

#include <iostream>

int k=5;

void fun(int * &p)
    {
    p=&k;
    }

int main()
    {
    int i=3;
    int *p = &i;

    std::cout << *p << std::endl;
    fun(p);
    std::cout << *p << std::endl;
    }

该函数改变传入的指针p的值;输出为'3'和'5'。

如果我放弃'&amp;'在上面的函数声明中,我得到类似以下python代码片段的内容:

def fun(p):
    p=5

p=3
print p
fun(p)
print p

其中两次打印3次因为fun无法改变主体中'reference'p的值。有什么方法可以像上面的C ++位一样获得行为吗?

(为了完整性:我知道python的数据传递模型与按值传递指针不同,因为你不需要在函数内显式地取消引用它。它更像是通过值传递引用。但是,我不能通过引用传递引用来编写上面的C ++示例,因为C ++不允许我更改引用。所以请忽略这个区别。)

3 个答案:

答案 0 :(得分:2)

不,你不能。 Python is pass by assignment

替代解决方案是提供类或可变容器的实例,但从长远来看这些都是坏主意,它最好再次返回值并通过为其指定返回值来修改全局变量。

答案 1 :(得分:0)

您可以将变量传递到可变对象中,如下所示:

def fun(p):
    p[0]=5
p=[3]
print p
fun(p)
print p

但这会影响代码的可读性。

答案 2 :(得分:0)

虽然其他答案是正确的,因为Python实际上没有一种简单的方法可以做我所要求的,但有一种后门的做法:修改'locals'字典。当我尝试做类似于我在问题中提出的类似事情但是通过C API时,SO上的善良的灵魂向我指出了这一点。有关详细信息,请参阅https://stackoverflow.com/a/21976146/120751