go和python變數賦值的一個小問題

來源:互聯網
上載者:User
這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。

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

package mainimport "fmt"type student struct {    Name string    Age  int}func pase_student() {    m := make(map[string]*student)    stus := []student{        {Name: "zhou", Age: 24},        {Name: "li", Age: 23},        {Name: "wang", Age: 22},    }    for _, stu := range stus {        m[stu.Name] = &stu    }    fmt.Println(m["zhou"].Name)}func main() {    pase_student()}

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

time.Sleep(60)  # 思考

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

為什麼是wang呢?你tm給我解釋解釋什麼是驚喜:

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

var stu student for _, stu = range stus {m[stu.Name] = &stu}

所以&stu自始至終都是一個地址,變化的是這個地址上儲存的值。&stu最終儲存的值是student{Name: "wang", Age: 22}結構體,所以拿出來的是wang

可以將m打出來看一下:

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

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

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

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

而在python中,變數是對象的名字,運行時變數可以綁定到任意的對象上。如下所示:

In [4]: a = 123456In [5]: id(a)Out[5]: 4426596208In [6]: a = 1234567In [7]: id(a)Out[7]: 4426592592

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

也就是說,當你迴圈一個list的時候,每次得到的是不同對象,變數指向了不同的地址:

In [9]: for i in [2222, 2223, 2224]:   ...:     print(id(i))   ...:442659620844265923364426596080

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

python中說的賦值就是建立一個對象的引用,是實話。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.