原文地址:https://www.v2ex.com/amp/t/443384app
Python 的賦值坑 , a=b=c=1???
今天回答了一個主題, 一不當心進入了一個坑, 耗費了好多時間終於弄懂了 我想要將 a,b,c 變量同時賦值 1, 我使用了 ``` In [192]: a = b = c = 1 In [193]: a, b, c Out[193]: (1, 1, 1) ``` 很明顯我賦值成功了,a、b、c 都是 1 可是這個下賦值順序是怎麼樣的 首先讓咱們先猜想一下: 第一種方式:a,b,c 同時賦值 1,a=1, b=1, c=1 第二種方式:依次賦值 c=1, b=c, a=b 以上兩種顯然是很合理的 可是咱們要驗證一下: 因而我開始說到我遇到的坑(其實這個是在說明 list 的 append 添加方法爲何返回的是 None 出現的) 假如咱們建立變量 L 賦值爲空, 咱們先 L 以切片的形式添加 x 值 ``` In [200]: L = [] In [201]: x = 4 In [202]: L[len(L):] = [x] In [203]: L Out[203]: [4] ``` 我已經添加成功 因爲 Python 的引用原理,咱們能夠屢次添加 因而我想屢次添加: ``` In [206]: L = [] In [207]: L[len(L):]=L[len(L):] = [x] In [208]: L Out[208]: [4, 4] ``` 如我所料的同樣我成功添加了 2 個 4, 也是說我每次都能得到 4,並向 L 尾部相加, 能夠肯定是第一種方式, 由於第二種根本只能加進一個 4: 第一種:L[len(L):]= [x], L[len(L):]= [x] 第二種:L[len(L):]= [x],L[len(L):]= L[len(L):] 好下面重點來了,我而後重點來了, 我又寫了一個語句 ``` In [209]: L = [] In [210]: L = L[len(L):]=L[len(L):] = [x] In [211]: L Out[211]: [4, 4, 4, 4] ``` 這個不對啊 L 不該該等於[4]或者[4, 4, 4]嗎,爲何會預測出兩個結果,這個是賦值順序問題, 正序和逆序 第一種方式的兩種順序: 正序:L = [x], L[len(L):] = [x], L[len(L):] = [x] L=[4,4,4] 逆序:L[len(L):] = [x],L[len(L):] = [x],L=[x] L=[4] 可是爲何會出現[4, 4, 4,4] 惟一的解釋即是第三種賦值方式: L = [x] # L = [4] L[len(L):]=L # L=[4,4] L[len(L):]=L # L=[4, 4, 4, 4] 這樣咱們就徹底解釋了這種情況 因此針對 a=b=c=1 這種賦值方式,實際上是 a=1, b=a, c=a