该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个是python独有的赋值方法 萌新不懂很正常啦
这个叫做“元组赋值法” 他会把前后两个部分当成一个元组去操作 所以在赋值过程中值不会改变 只有结束赋值后才会改变
什么意思呢 也就是说逗号前面和逗号后面赋值是【同时发生】的
举个例子
a=1
b=0
a, b = a+1, a+1
最后的结果是a和b都是2
然而如果你先a = a+1 再a = b+1 那么结果是a为2 b为3 因为这一串操作时先a后b的 而元组赋值法可以视为是【同时发生】的赋值行为
这种赋值方法可以免除我们很多的麻烦 最简单的例子就是:交换变量
以前听过一个笑话 说3个程序员 两个是学c系列语言的 还有一个是学python的 他们讨论怎么交换变量的值
普通c语言程序员写到(c的语法和python不一样 但是类似 第一行等价于def swap(a, b):):
void swap(int &a, int&b){
temp = a;
a = b;
b = temp;}
二逼c语言程序员写到:
void swap(int &a, int&b){
a = a^b;
b = a^b;
a = a^b;}
python程序员写到:
def swap(a, b):
a, b = b, a
可以看出 有了元组赋值法 其他语言至少需要3行的交换行为现在只需要1行就ok了
另外有人可能不大明白 明明没有括号 为什么他们还是元组呢?
我这里再重申一遍 元组的关键字(就是看到他就知道他是元组 比如列表的关键字是[] 字典是{})不是小括号 而是逗号
你可以尝试一下如下的代码
a = 1, 2
type(a)
返回的结果是 意思是:元组
【进阶】
那么为什么元组赋值法在过程中变量不改变呢?
首先我们补全一下这行代码(以你的代码为例):
(a, b) = (b, a+b)
好的 现在前后都是一个元组了
但是我们还是不明白 那我们把他拆开来
首先前面是一个元组:
tuple1 = (a, b)
后面也是一个:
tuple2 = (b, a+b)
假设a和b分别为1、2
那么现在
tuple1 → (1,2)
tuple2 → (2, 3)
然后我们进行赋值操作
tuple1 = tuple2
这就是结果了吗 不是的 因为tuple1是我们虚构出来的“临时变量” 并不是程序员可以直接使用的变量
于是我们还原回去
a = tuple1[0]
b = tuple1[1]
完美 这就是为什么我们称它【赋值是同时发生的】了
学完这些 机制的你会发现我们最后的赋值其实可以这么写
a, b = tuple1
这就是python简洁的妙处
“人生苦短
我用python”
——Bruce Eckel