当前位置: 首页 > news >正文

算法学习记录11——Python 多变量赋值问题

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

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

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

代码 1(能正确反转):

def reverseList(head):last = Nonewhile head:# 关键赋值行last, head.next, head = head, last, head.nextreturn last

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

def reverseList(head):last = Nonewhile head:# 关键赋值行(顺序不同)head, head.next, last = head.next, last, headreturn 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 这里断了。

http://www.dtcms.com/a/566582.html

相关文章:

  • 怎样拥有自己的网站外行学习个人网站建设
  • 建设部城市管理监督局网站官网建站系统源代码
  • html网站地图模板房地产型网站建设
  • 基于YOLOv10的水质污染检测:水面漂浮油污与垃圾智能识别实战
  • 大唐网站建设全国文明城市创建方案
  • 奉贤集团网站建设军队房地产与建设工程法律实务在哪个网站可以购买
  • 上海做网站培训班成都室内设计公司排名前十
  • 建设网站公司是什么淘宝网站的推广方案
  • 长沙自助模板建站网上商城是什么
  • 【动手学深度学习】关于数据转换的时候出现TypeError和iloc
  • 网站建设案例 杭州远大昆明网站建设 熊掌号
  • 无锡网站建设方案优化网站建设吕凡科技
  • MODBUS协议学习(基于RS485总线)一文学会
  • Win10/Win11文件夹图片不能预览怎么解决?
  • linux之arm SMMUv3 client 设备DMA配置过程分析(8)
  • Java企业实战微服务全栈零基础完整使用
  • 做外贸 网站邮箱申请百度自动点击器
  • 楼盘 东莞网站建设关于网站建设的合同范本
  • 代码随想录训练营打卡Day34| 动态规划part03
  • ES 使用URL增删改查
  • C++中指针和引用的区别
  • 对单位网站建设的建议昆明网站设计都需要设计什么
  • 一流的龙岗网站设计旅游网站制作分析
  • 建设网站需要申请什么网站建设20推广
  • 轻量级网站开发简单 网站设计
  • win10程序(十四)pdf转docx简易版
  • 怎么把网站关联到万网做网站网关备案
  • 网站的优化用什么软件wordpress门户型多栏设计
  • 长江商学院 网站建设妇幼能力建设网站
  • Java设计模式精讲---导学篇