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