在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 ++不允许我更改引用。所以请忽略这个区别。)
答案 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。