原文地址:https://www.v2ex.com/amp/t/443384
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
我想要將 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