鱼C论坛

 找回密码
 立即注册
查看: 1669|回复: 9

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

[复制链接]
发表于 2022-2-13 16:26:20 | 显示全部楼层 |阅读模式
30鱼币

>>> (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
>>> 

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 16:36:55 | 显示全部楼层
既然都说了a=2 那(a,b) == (1,2)  咋能成立呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 16:38:44 | 显示全部楼层
>>> (a,b)=(b,a)=(1,2)   这句代码 我解析就是:
给a,b赋初值1,2  同时完成交换
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 16:45:15 | 显示全部楼层
a, b = b, a = 1, 2

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

结果:
a = 2
b = 1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 16:46:03 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-13 16:50 编辑

像这种连续赋值都是从左到右依次赋最右边的那个值,你拿列表来试一下就知道了
>>> a = a[2:3] = [1, 2, 3, 4, 5]       # 赋值顺序是先 a = [1, 2, 3, 4, 5]  然后再 a[2:3] = [1, 2, 3, 4, 5],因为此时a已经定义了了,所以不会报错
>>> a
[1, 2, 1, 2, 3, 4, 5, 4, 5]
>>> b[2:3] = b = [1, 2, 3, 4, 5]               # 赋值顺序是先 b[2:3] = [1, 2, 3, 4, 5]  然后再 b = [1, 2, 3, 4, 5],因为先执行b[2:3] = [1, 2, 3, 4, 5],此时b还没有定义,所以报错了
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
>>> 
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-13 16:53:42 | 显示全部楼层
darrenkwan 发表于 2022-2-13 16:49
看我这理解可不可以,

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

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

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

至于赋值顺序你看我上面说的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-6 06:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表