python里的赋值都是引用,第一次赋值就是定义。
看下面两个交换值的例子:
1.
1 >>> a,b,c = 1,2,3 2 >>> a = b 3 >>> b = c 4 >>> c = a 5 >>> a,b,c 6 (2, 3, 2)
2.
1 >>> a,b,c = 1,2,3 2 >>> a,b,c = b,c,a 3 >>> a,b,c 4 (2, 3, 1)
初一看,很奇怪,这两种交换怎么会不一样呢?
简单点理解就是第一种是按顺序交换,但第2种是同时交换。
python的这种引用机制类似于c语言的指针。
a = 1 即a 引用1 这个值(a指向1)
情境1:a,b,c分别赋值1,2,3
a = b #a指向b,b又指向2,即a 指向2 a =2
b = c #b 指向c,c又指向3,即b指向3 b =3
c = a #c指向a,a又指向2(此时已经不指向1了),所以c =2
结果就是a,b,c分别为:2,3,2
情境2:a,b,c 同样分别赋值1,2,3
a,b,c = b,c,a
按照情况一的分析思路:
a指向b,b指向2 a指向2
b指向c,c指向3 b指向3
c指向a,a指向2 c指向2
如果你按这思路分析,那不是这两种交换不应该没区别吗?但结果明显不同啊
那么重点是这样理解a,b,c = b,c ,a明显不能这么理解
这交换值之前有一个前提:赋值运算的运算顺序是从右向左运算
a,b,c = b,c ,a 解释器会先找从右边计算:也是说先找到,b,c,a引用的值:2,3,1,然后向左边赋值。
结果就是:a,b,c = 2,3,1
(a = 1形象点理解就是:1(值)是个箱子,a(变量)是标签。a,b,c = 1,2,3就是将标签分别贴到这三个箱子上。
情境1:
a = b #将a贴到b所在的箱子上:a = 2
b =c #将b贴到c所在的箱子上:b =3
c = a #将c 贴到a所在的箱子上(此时a贴在数字为2的箱子上):c =2
结果:a,b,c = 2,3,2
情境2:
交换时会先找到b,c,a所在的箱子2,3,1然后将左边a,b,c三个标签对应贴上去。
结果:a,b,c = 2,3,1
)
下面是可能应用到的地方,例如下面的菲波拉契数列:
第一种赋值,需要交换。
1 def fab(a, b): 2 print(a, end=' ') 3 4 temp = a 5 a = b 6 b = a + temp 7 8 if a < 100: 9 fab(a, b) 10 11 a, b = 0, 1 12 fab(a, b)
第二种:
1 def fab(a, b): 2 print(a, end=' ') 3 4 a, b = b , a+b 5 6 if a < 100: 7 fab(a, b) 8 9 a, b = 0, 1 10 fab(a, b)
两种情况都输出:0 1 1 2 3 5 8 13 21 34 55 89
也算是一种便利吧。