在python中通过引用传递引用

Posted

技术标签:

【中文标题】在python中通过引用传递引用【英文标题】:Pass reference by reference in python 【发布时间】:2014-02-17 10:24:10 【问题描述】:

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

我想到的是以下C++ sn-p的类似物,

#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”。

如果我在上面的函数声明中删除“&”,我会得到类似于以下 python sn-p 所做的事情:

def fun(p):
    p=5

p=3
print p
fun(p)
print p

打印 3 两次,因为 fun 无法更改主体中“引用”p 的值。有什么方法可以获得上述 C++ 中的行为?

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

【问题讨论】:

“我知道python的数据传递模型和按值传递指针不一样”它IS和按值传递指针一样。 Python 中的每个值都是一个指针。例如,. 运算符将指针作为左操作数。 【参考方案1】:

不,你不能。 Python is pass by assignment

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

【讨论】:

会 +1,因为第一部分是正确的,但第二部分是非常具体的,你不能在真空中肯定地说任何解决方案是否比其他任何解决方案更好。 通常称为“传值”。【参考方案2】:

虽然其他答案是正确的,因为 Python 并没有一种简单的方法来做我所要求的事情,但有一种后门的做事方式:修改 'locals' 字典。当我试图做一些与我在这里的问题中提出的类似的事情时,SO 上的一个善良的灵魂向我指出了这一点,但通过 C API。详情请见https://***.com/a/21976146/120751。

【讨论】:

【参考方案3】:

你可以像这样在一个可变对象中传递你的变量:

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

但这会损害代码的可读性。

【讨论】:

以上是关于在python中通过引用传递引用的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中通过引用/值传递

在 C++ 中通过引用传递对象

何时在 PHP 中通过引用传递

为啥在 PHP 中通过引用传递?

无法在 MySQLi 中通过引用传递参数 [重复]

如何在 Ruby 中通过引用传递?