Python 多变量赋值问题小结

 更新时间:2025年11月06日 15:10:49   作者:Voyager_4  
本文给大家介绍Python 多变量赋值问题,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

今天在刷链表反转题的时候,遇到了两段看起来几乎一样的代码,结果一个能正确反转链表,一个却不行。仔细研究后发现,问题出在 Python 的多变量赋值顺序上 —— 这个平时没太在意的细节,在操作链表指针时居然能造成这么大的影响。记录一下我的分析过程,免得以后再踩类似的坑。

问题背景:两段 “相似” 的反转代码

先看这两段代码,都是用迭代法反转单链表:

代码 1(能正确反转):

def reverseList(head):
    last = None
    while head:
        # 关键赋值行
        last, head.next, head = head, last, head.next
    return last

代码 2(无法正确反转):

def reverseList(head):
    last = None
    while head:
        # 关键赋值行(顺序不同)
        head, head.next, last = head.next, last, head
    return last

第一眼看上去,只是左侧变量的赋值顺序变了,右侧的值好像还是那几个。但实际运行时,代码 1 能得到正确的反转链表,代码 2 却会返回错误结果(比如链表断裂、部分节点丢失)。这到底是为什么?

核心原因:Python 多变量赋值的 “秘密”

在 Python 里,多变量赋值的执行逻辑是 “先计算右侧所有表达式的值,再一次性赋值给左侧变量”。也就是说,右侧的值都是基于赋值前的原始状态计算的,不会被左侧的中间赋值影响。

但这一点,需要注意的是 “=”右侧是获取值,所以可以理解为完全并行执行的。但是左侧是改变值,这就意味着是会顺序影响

逐行分析:两段代码的执行差异

我们用一个简单的链表1->2->3来模拟执行过程,看看两段代码的区别。

代码 1 的执行逻辑(正确)

关键赋值行:last, head.next, head = head, last, head.next

拆解步骤(每次循环):

  1. 先算右侧值(基于当前原始状态):
  • 第一个值:head(当前节点,比如第一轮是 1)
  • 第二个值:last(上一个节点,初始是 None)
  • 第三个值:head.next(下一个节点,第一轮是 2)
  1. 再给左侧赋值
  • last = 第一个值(当前节点 1)→ 现在 last 指向 1
  • head.next = 第二个值(原 last,即 None)→ 节点 1 的 next 指向 None(完成反转第一步)
  • head = 第三个值(下一个节点 2)→ 移动 head 到下一个节点,继续循环

整个过程中,“反转当前节点指针” 和 “移动 head 到下一个节点” 是基于原始值操作的,互不干扰。比如不会因为 head 移动了,导致当前节点的指针没反转。

代码 2 的执行逻辑(错误)

关键赋值行:head, head.next, last = head.next, last, head

同样用1->2->3模拟:

  1. 先算右侧值(基于当前原始状态):
  • 第一个值:head.next(下一个节点 2)
  • 第二个值:last(初始 None)
  • 第三个值:head(当前节点 1)
  1. 再给左侧赋值
  • head = 第一个值(下一个节点 2)→ 此时 head 已经指向 2 了
  • head.next = 第二个值(原 last,即 None)→ 注意!这里的 head 已经是 2 了,所以实际是把节点 2 的 next 改成了 None
  • last = 第三个值(原 head,即节点 1)→ last 指向 1

这就出问题了:原本应该反转 “当前节点 1 的指针”,结果因为先移动了 head 到 2,导致实际修改的是 “节点 2 的指针”。节点 1 的指针根本没反转,后续循环也再也碰不到节点 1 了,链表直接从 1 这里断了。

到此这篇关于Python 多变量赋值问题的文章就介绍到这了,更多相关Python 多变量赋值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python爬虫实战之用selenium爬取某旅游网站

    Python爬虫实战之用selenium爬取某旅游网站

    上一篇我们已经知道怎么简单使用selenium了,那么我们就从这篇博客来动手爬取网站吧,文中有非常详细的代码示例,需要的朋友可以参考下
    2021-06-06
  • Python中你不知道的gzip高级用法分享

    Python中你不知道的gzip高级用法分享

    在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python 内置的 gzip 模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲讲吧
    2025-07-07
  • Python利用AI接口实现抠图并改图片底色

    Python利用AI接口实现抠图并改图片底色

    时候我们的证件照需要换底色,又来不及去照相馆拍照,用ps也不好抠图,所以今天给你们分享一下如何用python来抠图,并换底色,需要的可以参考一下
    2022-09-09
  • anaconda如何创建和删除环境

    anaconda如何创建和删除环境

    这篇文章主要介绍了anaconda如何创建和删除环境,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-04-04
  • Python实现的多进程和多线程功能示例

    Python实现的多进程和多线程功能示例

    这篇文章主要介绍了Python实现的多进程和多线程功能,结合实例形式分析了Python多线程与多进程实现分布式系统功能相关操作技巧,需要的朋友可以参考下
    2018-05-05
  • Python Web项目Cherrypy使用方法镜像

    Python Web项目Cherrypy使用方法镜像

    这篇文章主要介绍了Python Web项目Cherrypy使用方法镜像,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • 关于Python核心框架tornado的异步协程的2种方法详解

    关于Python核心框架tornado的异步协程的2种方法详解

    今天小编就为大家分享一篇关于Python核心框架tornado的异步协程的2种方法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-08-08
  • python使用logging模块记录日志的操作

    python使用logging模块记录日志的操作

    在编写 Python 程序时,日志记录是一个非常重要的部分,日志不仅帮助你在开发过程中调试代码,还可以在程序正式运行时提供诊断信息,帮助定位问题,在本文中,我们将介绍 Python 的 logging 模块,帮助你了解如何使用这个模块来记录和管理日志,需要的朋友可以参考下
    2024-10-10
  • 使用Pytorch训练分类问题时,分类准确率的计算方式

    使用Pytorch训练分类问题时,分类准确率的计算方式

    这篇文章主要介绍了使用Pytorch训练分类问题时,分类准确率的计算方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • 如何使用Python在2秒内评估国际象棋位置详解

    如何使用Python在2秒内评估国际象棋位置详解

    关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非Python与Go莫属,下面这篇文章主要给大家介绍了关于如何使用Python在2秒内评估国际象棋位置的相关资料,需要的朋友可以参考下
    2022-05-05

最新评论