說到多變數賦值時,先計算所有相關值,然后再從左到右依次賦值,但是這個規則不適用于python
我們來看一例:
package mainimport "fmt"func main() { data, i := [3]string{"喬幫主","慕容復","鳩摩智"}, 0 i, data[i] = 2, "枯榮大師" fmt.Println(i, data)}
輸出結果:
2 [枯榮大師 慕容復 鳩摩智]
有的朋友會認為,結果不應該是這樣么?(但是python下輸出的結果卻是下面的)?
2 [喬幫主 慕容復 枯榮大師]事實并如此,我們來看賦值順序這段的理解:
1 data, i := [3]string{"喬幫主","慕容復","鳩摩智"}, 02 i, data[i] = 2, "枯榮大師" //注意原則:先計算所有相關值,然后再從左到右依次賦值3 // 這里變數i 的順序其實是(i = 0,因為上一行的變數i是0) -> (然后 i = 2), (data[i] 此時取的值是data[0],而不是data[2],也就是data[0] = 枯榮大師)4 fmt.Println(i, data) //所以這里最終 輸出 i=2,[枯榮大師 慕容復 鳩摩智]
同樣的多變數賦值卻不適用于python.
data,i=["喬幫主", "慕容復", "鳩摩智"],0i, data[i] = 2, "枯榮大師" # 注意這里data[i] 已經是 data[2]了,即data[2]="枯榮大師"print(i,data) # 輸出 2 ['喬幫主', '慕容復', '枯榮大師']
另外:我們要注意重新賦值與定義新同名變數的區別:再看一例:
package mainfunc main() { name := "喬幫主" println(&name) name, age := "鳩摩智", 30 // 重新賦值: 與前 name 在同層次的代碼塊中,且有新的變數被定義, println(&name, age) // 通常函式多回傳值 err 會被重復使用, { name, weight := "清風揚", 50 // 定義新同名變數: 不在同層次代碼塊, println(&name, weight) }}
輸出:
0xc00002bf780xc00002bf78 300xc00002bf68 50
注意:因個人機器不同,大家回傳的記憶體參考地址可能和我的不一樣,但是 這步是重點,重點在這里:
同層級相同變數的賦值,記憶體地址并不會改變,不同層級相同變數的賦值,其實是定義了一個新同名變數,也就是大家看到的第三行記憶體地址變了,
接著我們再看有點意思的一段代碼(大家來找茬):
package mainfunc main() { name := "喬幫主" println(&name) name, age := "鳩摩智", 30 // 重新賦值: 與前 name 在同 層次的代碼塊中,且有新的變數被定義, println(&name, age) // 通常函式多回傳值 err 會被重復使用, name, weight := 100, 50 // 定義新同名變數: 不在同 層次代碼塊, println(&name, weight, age)}
輸出:
cannot use 100 (type int) as type string in assignment
原因很明顯,因為上面:name := "喬幫主" 已經隱試滴申明了name 是字串,等同于 var name string. 同層級再次賦值100為整形,這是不允許滴,
但是:重點來了,我們稍改下:
package mainfunc main() { name := "喬幫主" println(&name) name, age := "鳩摩智", 30 // 重新賦值: 與前 name 在同 層次的代碼塊中,且有新的變數被定義, println(&name, age) // 通常函式多回傳值 err 會被重復使用, { name, weight := 100, 50 // 定義新同名變數: 不在同層次代碼塊, println(&name, weight, age) }}
區別就是層級發生了變化,因為{}里面的name已經是新的變數了,
好啦,到此介紹結束了,博友們有關golang變數使用中遇到的各種奇怪的“坑”,請留下寶貴滴足跡,歡迎拍磚留言.
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/59778.html
標籤:Go
