簡體   English   中英

在python中通過引用傳遞引用

[英]Pass reference by reference in python

在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'。

如果我在上面的函數聲明中刪除'&',我會得到類似以下python代碼片段的內容:

def fun(p):
    p=5

p=3
print p
fun(p)
print p

其中兩次打印3次因為有趣無法改變主體中“參考”p的值。 有什么方法可以獲得上面的C ++位中的行為?

(為了完整性:我知道python的數據傳遞模型與按值傳遞指針不同,因為你不需要在函數內顯式地取消引用它。它更像是通過值傳遞引用。但是,我不能寫上面的C ++示例通過引用傳遞引用,因為C ++不允許我更改引用。所以請忽略這個區別)。

你不能。 Python通過賦值傳遞

替代解決方案是提供類或可變容器的實例,但從長遠來看這些都是壞主意,它最好再次返回值並通過為其分配返回值來修改全局變量。

您可以將變量傳遞到可變對象中,如下所示:

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

但這會損害代碼的可讀性。

雖然其他答案是正確的,因為Python並沒有真正有一種簡單的方法來做我所要求的,但有一種后門的做法:修改'locals'字典。 當我嘗試做類似於我在問題中提出的類似事情但是通過C API時,SO上的善良的靈魂向我指出了這一點。 有關詳細信息,請參閱https://stackoverflow.com/a/21976146/120751

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM