ten$1 发表于 2022-2-13 16:26:20

关于Python中(a,b)=(b,a)=(1,2)




>>> (a,b)=(b,a)=(1,2)
>>> (a,b)
(2, 1)
>>> (a,b) == (1,2)
False
>>>


不是规定了(a,b)=(b,a)=(1,2)
为什么最终 (a,b) == (1,2)是假

而且
>>> a
2
>>> b
1
>>>

wp231957 发表于 2022-2-13 16:36:55

既然都说了a=2 那(a,b) == (1,2)咋能成立呢

wp231957 发表于 2022-2-13 16:38:44

>>> (a,b)=(b,a)=(1,2)   这句代码 我解析就是:
给a,b赋初值1,2同时完成交换

ten$1 发表于 2022-2-13 16:42:23

wp231957 发表于 2022-2-13 16:38
>>> (a,b)=(b,a)=(1,2)   这句代码 我解析就是:
给a,b赋初值1,2同时完成交换

有没有一种可能
程序从左至右
先满足(a,b)=(1,2)   -> a=1, b=2

再满足(b,a)=(1,2)-> a=2, b= 1

wp231957 发表于 2022-2-13 16:44:26

ten$1 发表于 2022-2-13 16:42
有没有一种可能
程序从左至右
先满足(a,b)=(1,2)   -> a=1, b=2


就是这两个语句的简写(或称复合语句)

>>> a,b=b,a=1,2
>>> a
2
>>> b
1
>>> a,b=1,2
>>> a,b=b,a
>>> a
2
>>> b
1
>>>

傻眼貓咪 发表于 2022-2-13 16:45:15

a, b = b, a = 1, 2

拆分成:
a, b = b, a # 无意义,因为还没有定义
b, a = 1, 2

结果:
a = 2
b = 1

isdkz 发表于 2022-2-13 16:46:03

本帖最后由 isdkz 于 2022-2-13 16:50 编辑

像这种连续赋值都是从左到右依次赋最右边的那个值,你拿列表来试一下就知道了

>>> a = a =        # 赋值顺序是先 a = 然后再 a = ,因为此时a已经定义了了,所以不会报错
>>> a

>>> b = b =                # 赋值顺序是先 b = 然后再 b = ,因为先执行b = ,此时b还没有定义,所以报错了
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>>

darrenkwan 发表于 2022-2-13 16:49:00

看我这理解可不可以,

>>> (a,b)=(b,a)=(1,2)                              #这里的‘=’意思是,ab的值互换,然后令b=1, a=2
>>> (a,b)
(2, 1)
>>> (a,b) == (1,2)                                    #那这个判断当然false了
False
>>>

isdkz 发表于 2022-2-13 16:53:42

darrenkwan 发表于 2022-2-13 16:49
看我这理解可不可以,

==运算的结果是什么,你看它们的值就好,不用想这么复杂,

(a, b) 的值都是(2,1)了

(2,1)能跟(1,2)相等吗?元组是有顺序的,那肯定不等了,所以就False了

至于赋值顺序你看我上面说的

傻眼貓咪 发表于 2022-2-13 17:03:57

ten$1 发表于 2022-2-13 16:42
有没有一种可能
程序从左至右
先满足(a,b)=(1,2)   -> a=1, b=2


虽说 Python 比较不讲究左右值,但如 C 语言:
一般程序语言涉及左值(lvalue)和右值(rvalue)
1, 2 是字面常量(右值),a, b 是变量(左值)

不能一行代码就解决赋值再交换,除非直接赋值,如:

a = 1
b = 2
a, b = b, a

可以写成 b, a = 1, 2 # 直接赋值

结果:
a = 2
b = 1
页: [1]
查看完整版本: 关于Python中(a,b)=(b,a)=(1,2)