Python 的賦值坑 , a=b=c=1???


原文地址: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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM