Python 链式赋值:为什么代码输出 (3, 2, 1) 而不是 (1, 2, 3)?

聖光之護
发布: 2024-11-10 13:27:20
原创
725人浏览过

python 链式赋值:为什么代码输出 (3, 2, 1) 而不是 (1, 2, 3)?

python 链式赋值机制解读

刚接触 python 的编程新手常常被链式赋值操作搞得一头雾水。例如:

a, b, c = b, c, a = c, b, a = 1, 2, 3
print(a, b, c)
登录后复制

令人惊讶的是,代码输出结果并非 (1, 2, 3),而是 (3, 2, 1)。本文将深入剖析 python 中链式赋值的机制,解答这一令人困惑的问题。

python 中的赋值顺序

立即学习Python免费学习笔记(深入)”;

不同于 c 语言,python 中的赋值是从右往左进行的。也就是说,在上述代码中,首先赋值给最右边的变量 a,然后再依次赋值给 b 和 c。

字节码解析

DALL·E 2
DALL·E 2

OpenAI基于GPT-3模型开发的AI绘图生成工具,可以根据自然语言的描述创建逼真的图像和艺术。

DALL·E 2 44
查看详情 DALL·E 2

为了更直观地理解代码执行过程,我们可以使用 dis 模块查看字节码:

$ python -m dis ./main.py
   1           0 LOAD_CONST               0 ((1, 2, 3))
              2 DUP_TOP
              4 UNPACK_SEQUENCE          3
              6 STORE_NAME               0 (a)
              8 STORE_NAME               1 (b)
             10 STORE_NAME               2 (c)
             12 DUP_TOP
             14 UNPACK_SEQUENCE          3
             16 STORE_NAME               1 (b)
             18 STORE_NAME               2 (c)
             20 STORE_NAME               0 (a)
             22 UNPACK_SEQUENCE          3
             24 STORE_NAME               2 (c)
             26 STORE_NAME               1 (b)
             28 STORE_NAME               0 (a)

  2          30 LOAD_NAME                3 (print)
             32 LOAD_NAME                0 (a)
             34 LOAD_NAME                1 (b)
             36 LOAD_NAME                2 (c)
             38 CALL_FUNCTION            3
             40 POP_TOP
             42 LOAD_CONST               1 (None)
             44 RETURN_VALUE
登录后复制

字节码中,dup_top 指令用于复制栈顶元素。unpack_sequence 指令用于将序列(如元组)解包并将其元素压入栈中。

执行过程

  1. 压入元组 (1, 2, 3) 栈中:load_const 指令将元组 (1, 2, 3) 加载到栈中。
  2. 复制元组:dup_top 指令复制栈顶元素,即元组,在栈中形成两个相同的元组。
  3. 解包第一个元组并赋值:unpack_sequence 指令将栈顶元组解包并依次赋值给 a, b, c。栈中的第一个元组作为第一个值被弹出。
  4. 复制第二个元组:dup_top 指令再次复制栈顶元组,在栈中形成两个相同元组。
  5. 解包第二个元组并覆盖赋值:第二个 unpack_sequence 指令将栈顶元组解包并覆盖赋值给 b, c, a。栈中的第二个元组作为第二个值被弹出。
  6. 解包第三个元组并覆盖赋值:第三个 unpack_sequence 指令将栈顶元组解包并覆盖赋值给 c, b, a。栈中的第三个元组作为第三个值被弹出。
  7. 调用 print 函数并输出结果:最后,print 函数被调用,将变量 a, b, c 的值输出到控制台。

结论

简而言之,python 中链式赋值是 从右往左赋值 的,并且每个赋值操作都会覆盖前面的赋值结果。最终输出的结果反映了最后一个赋值操作的作用。

以上就是Python 链式赋值:为什么代码输出 (3, 2, 1) 而不是 (1, 2, 3)?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门推荐
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号