
如上圖,為什么上下兩段代碼中各自的第三個輸出值不一樣(第一段代碼第二、三個輸出值是一樣的,說明函式中的a和初始定義的a是同一個嗎?而第二段代碼中第二、三個輸出值是不一樣的,說明函式中的a和初始定義的a不是同一個嗎?但函式的基本結構是一樣的啊),我想問問大俠們,案例說函式中的變數沒有宣告過全域變數,應該都是區域變數,那按說第二段代碼是正常的,但第一段代碼怎么回事呢?先謝了
uj5u.com熱心網友回復:
第一部分: a =[ ],那么a就是一個串列,是可變的。當它傳入函式aaa(a)時,外面的a和函式里面的a都是指向共一個串列參考的。串列是可變的,那么a.append(0)就相當于往串列內部添加一個元素0,是對串列本身的原位置改變。內外a都是指向串列的,所以列印的時候都是輸出串列a。
第二部分:a=0,那么a就是個不可變的數值。當它傳入函式aaa(a),對a +=1時,相當于把內部的這個a指向一個新的參考(數值是不可變的)
內部列印的操作都是針對函式內部區域變數a,而函式外部的a是沒有改變的。最終在函式體外部的print(a)輸入的就是第一行的a。
也就是說內外的a實際上是兩個物件。
不知道說清楚沒有,不對的請樓下補充。
uj5u.com熱心網友回復:
因為串列是可變型別,a只是串列的一個參考,當你向a中添加元素時,實際上是向記憶體中的串列,添加了一個值,a指向的是這個串列的地址簡單來說 a指向一個串列,你在函式中的操作相當于對串列進行操作,與a無關
而第二種a指向0這個數,屬于不可變型別,當執行a+=1后,函式中的a所指向的值變成了1,故輸出1,但全域變數中的a的指向仍舊是0
可能我也說的不是很清楚,建議百度了解一下python引數傳遞方式(共享傳遞)
uj5u.com熱心網友回復:
首先在函式體內,你列印了空串列[],串列追加了0元素之后,又列印了包含0元素的串列[0]函式運行完之后,由于串列是參考變數,所以列印的串列是被改變之后的串列[0]
uj5u.com熱心網友回復:
結合了各位大俠的說法和解釋,我想了想,應該是前后后兩段代碼中的函式中的a和之前定義的a其實都應該是兩個不同的變數,只是當變數是list時,這個其實就是一個指標(c語言的說法,不知道Python里怎么說),也就是兩個不同的a都指向同一個位置,所以list里的具體內容變了,兩個list指的內容也就都變了然后只是簡單數值變數時,兩個不同的a是不同存盤位置上的兩個變數,所以,函式里的變化,對外面的變數沒有關系。
但這樣看來,第一個(list型別)其實無意中就是實作了函式中定義全域變數的效果了,或者就是實作函式return的效果。是嗎?
uj5u.com熱心網友回復:
差不多吧 等以后用著用著你就知道了,先這么理解沒問題轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/189649.html
上一篇:python打包exe檔案
下一篇:2020-10-23
