def func(ls=):
return ls
a = func()
b = func()
print(a, b)
考慮這段**的輸出,要理解python中物件及引用的概念。
首先,在整個**中,a = func()是func函式的第一次執行。在這次呼叫執行中,func函式的ls引數使用了預設值,也就是乙個空列表物件。
呼叫結束後,這個列表物件的值變成了[1],被return給了呼叫者。這時,這個物件是包含乙個元素的列表,有兩個變數指向它,a變數和ls變數,也可以說a和ls是這個物件的引用。這裡要注意,這時由於有外部變數a指向它(引用它),所以呼叫結束後它的儲存空間並沒有被銷毀,它的值[1]被保留著。
所以在b = func()這次呼叫中,ls這個引數所指向的儲存空間存在且已經有值[1],所以這次呼叫不需要使用預設值,而使用它已經有的值進行運算,運算結束後返回給了b。
最後,變數a,b,ls都指向這個物件,值都是[1,1]。
總結,python中,一切儲存空間都是乙個物件,變數名都是對這個物件的引用。當所有對它的引用(變數),生命週期都結束了,系統就銷毀了這個物件,**儲存空間。
上面是2019-09-20的理解。
下面是2019-11-5的更新
最近又研究了一下這個問題,發現下面的**同樣會在最後輸出[1, 1]。
def func(ls=):
print(ls)
func()
func()
在這段**中就沒有變數a,b影響ls的生命週期了,但ls的值仍然在記憶體中,所以上面的理解就不準確了。 Python引用的理解
不可變物件 資料 字串 元組,即使有多個變數共享引用,也不會因為某乙個變數的改變而影響其他共享引用的變數的值 某個變數的改變直接使得該變數不再是之前物件的引用 可變物件 列表 字典 集合,當有多個物件共享引用時,某乙個變數的改變 比如改變某項的值 會直接改變引用的物件的值,而該變數的引用未變 序列的...
深入理解C 中的物件和物件引用
有言在先 返回區域性物件和引用,就像返回區域性變數的位址一樣,非常非常危險,要避免使用 先來看乙個入門級的程式 include using namespace std class a void fun a a int main 結果為 a constructor 編譯器自動產生的拷貝建構函式得到了呼...
如何理解Python中的引用(一)
在 python 中,變數命令,引數傳遞,都是通過引用來實現。如果兩個變數為同乙個引用,那麼這兩個變數對應的資料一定相同 但是兩個對應的資料相同,引用不一定相同。從資料可變與不可變的型別來解析引用 可變資料型別 列表 字典 集合 通過容器的方法來修改其內容,位址不變 引用指向不會發生改變 通過重新賦...