Python中變量之間賦值的理解
1.問題描述
在Python項目中,有一個這樣的需求:
一個文件a需要負責提供一個函數,返回該文件中一個全局變量value,類似與get_value()接口
在另一個文件b中,創建一個變量temp=get_value(),去取a文件中的value,而且希望后續a文件中對value的修改,會直接影響到b文件中的temp
例如:在a文件中,有個函數叫set_value(),里面執行value = Myclass(),希望temp也受到修改影響,變為指向新的MyClass
# a.py
value = MyClass()
def get_value():
return value
def set_value():
value = MyClass()
# b.py
import a
temp = get_value()
print(temp)
set_value()
print(temp)
但上面這樣操作,顯然不會滿足需求。
2.Python中變量的賦值邏輯
對于等號右方為非變量名時,如:value = "string" 或者 value = 10 或者 value = MyClass()
均可以理解成:value指向了一塊空間a,里面存放著右側這些數據.(value為該指針名字)

當等號右方為變量名時,如 b = value,
可以理解成:一個新的指針b,指向了value所指向的那塊空間

所以,理解了上述賦值的區別后,1中的情況就很好解釋了:
temp = get_value()時,temp指針指向了value所指向的那塊空間

此時調用set_value,value又重新指向了另一塊新的MyClass空間,但temp依舊指向原來的MyClass

所以value的修改并不會影響temp,故無法滿足需求。
3.解決方案
很明顯,上述實現的阻礙在于,value更新時,會指向新的空間,導致外界的temp無法及時同步更新。
因此我們考慮讓value降低一層,包裹在更高一層的容器中
有一個list數據a, a = [value, value1, value2, value3]

我們get這個list a,get_a(), temp = get_a()

按照上述的理解,所有的value實際上都是一個指針,指向了賦值給自己的空間

如果此時set_value,實際上是修改a[0]=MyClass(),由于value被a容器所管理,即使它指向了新的地方,也可以通過a直接訪問,又temp指向的本身是容器a,故temp也可以直接訪問到新的value

故我們目的達到,當value被修改時,我們可以通過temp取到更新后的value值
Ps:最主要的是和C++中的賦值區分開,不能單純用C++的引用去理解

浙公網安備 33010602011771號