go和python變數賦值遇到的乙個問題

2022-09-29 23:03:20 字數 1519 閱讀 9455

平時寫得多的是python,最近看了一點go,今天碰到了乙個問題,和大家分享一下

package main

import "fmt"

type student struct

func pase_student() ,,,

} for _, stu := range stus

fmt.println(m["zhou"].name)

}func main()

**很簡單,大家可以思考一下會列印出什麼。

time.sleep(60)  # 思考

結果是 wang !,驚喜不驚喜!遍歷賦值啊同學們,這麼簡單的操作都能出么蛾子,wtf!

為什麼是 wang 呢?

你tm給我

解釋解釋

什麼是驚喜程式設計客棧

:for迴圈的時候,變數stu的指標是yczio不變的,每次迴圈僅僅是對student結構體的 值 拷貝,上面的for迴圈和下面是一樣的:

var stu student

for _, stu = range stus

所以 &stu 自始至終都是乙個位址,變化的是這個位址上儲存的值。 &stu 最終儲存的值是 student 結構體,所以拿出來的是 wang 。

可以將 m 打出來看一下:

map[zhou:0xc42000a260 li:0xc42000a260 wang:0xc42000a260]

驗證了我們上面的想法,大家的value都是同乙個位址。

看到這裡,如果是乙個日常寫c,c++等強型別語言的同學可能會說,神經病啊!這有什麼好說的!不就是這樣的嗎!請原諒我,我日常寫python的 [捂臉]。

從上面的例子可以看出來,在go中,變數名是 儲存位址的名字 。它在編譯時繫結已經完成,執行時是不可以改變的,你只能改變位址中儲存的值。

而在python中,變數是物件的名字,執行時變數可以繫結到任意的物件上。如下所示:

in [4]: a = 123

in [5]: id(a)

out[5]: 4426596208

in [6]: a = 1234567

in [7]: id(a)

out[7]: 4426592592

注意:由於python對int型別實現了 小整數物件池 ,不要用 0-255 的整數做實驗,不然你得到id會是一樣的。

也就是說,當你迴圈乙個list的時候,每次得到的是不同物件,變數指向了不同的位址:

in [9]: for i in [2222, 2223, 2224]:

...: print(id(i))

...:

4426596208

4426592336

4426596080

上面這段**,python為我們建立了3個 pyintobject , i 只是他們的名字。而在go中,可以認為只有乙個object,值變化了3次。

python中說的 賦值就是建立乙個物件的引用 ,是實話。

本文標題: go和python變數賦值遇到的乙個問題

本文位址:

python中連續賦值遇到的問題

在學習生成器的時候做了乙個生成斐波那契數列的練習,下面是練習的 import sys def fib n a,b,count 0,1,0 while 1 if count n return yield a a,b,count b,a b,count 1 f fib 10 while 1 try pr...

反射給物件賦值遇到的問題 型別轉換

給乙個物件屬性賦值可以通過propertyinfo.setvalue 方式進行賦值,但要注意值的型別要與屬性保持一致。建立物件例項的兩種方法 1.1 var obj assembly.load assemblyname createinstance assemblyname classfullnam...

C 反射給物件賦值遇到的問題 型別轉換

給乙個物件屬性賦值可以通過propertyinfo.setvalue 方式進行賦值,但要注意值的型別要與屬性保持一致。建立物件例項 1 var obj assembly.load assemblyname createinstance assemblyname classfullname 2 var...