[英]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.