鱼C论坛

 找回密码
 立即注册
查看: 2846|回复: 7

Python第44讲课后作业

[复制链接]
发表于 2022-9-28 15:24:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 dami27 于 2022-9-28 15:27 编辑

看了解析也没有明白这两个的区别,请问该如何理解


                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-28 19:38:42 | 显示全部楼层
请详细说明问题,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-28 20:42:35 | 显示全部楼层
不好意思,图片没挂上
1.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-28 22:47:07 | 显示全部楼层
区别在于x=[::-1]这句是给x重新赋值,而x[:]=x[::-1]这句不改变X的内存id,只是换了内容,类似x.reverse()方法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-29 08:27:13 | 显示全部楼层
lassiter 发表于 2022-9-28 22:47
区别在于x=[::-1]这句是给x重新赋值,而x[:]=x[::-1]这句不改变X的内存id,只是换了内容,类似x.reverse() ...

看完你的解释之后我也有一个疑惑,那就是为什么x[:] = x[::-1]这样的语法是成立的?
由于id(x) == id(x[:])的结果是False,id(x) == id(x[::-1])的结果也是False,所以x[:]和x[::-1]这两个操作都是返回新的列表对象。既然如此,那么x[:] = x[::-1]不就类似[1, 2, 3] = [3, 2, 1]了吗?而这显然是不成立的。
那么x[:] = x[::-1]到底发生了使得这个语句成立而且还没有修改x的原有id呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-29 22:27:46 | 显示全部楼层
本帖最后由 lassiter 于 2022-9-29 22:32 编辑
Brick_Porter 发表于 2022-9-29 08:27
看完你的解释之后我也有一个疑惑,那就是为什么x[:] = x[::-1]这样的语法是成立的?
由于id(x) == id(x[ ...


首先你要搞清楚,在python中“=”是赋予的意思,“==”才是等于的意思
其次,把x[:]放在=左边和直接写个x[:],应该会执行不同操作,比如一个是赋予操作,等号左边只提供内部元素的坐标,把=右边的坐标与左边关联;一个是提取显示,会另寻一个坐标复制数值显示。

如果不是专门研究底层逻辑,那学会使用就行,别纠结了。

x[:] = x[::-1]这句话的意思是,将x中元素从后往前排列并赋予到x正序的位置,类似a,b=b,a  就是交换了内存id
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-30 09:33:42 | 显示全部楼层
lassiter 发表于 2022-9-28 22:47
区别在于x=[::-1]这句是给x重新赋值,而x[:]=x[::-1]这句不改变X的内存id,只是换了内容,类似x.reverse() ...

那x = x[::-1]这条的内存结构是不是应该是反的?
x -> 3 2 1
y -> 1 2 3
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-30 10:16:38 | 显示全部楼层
lassiter 发表于 2022-9-29 22:27
首先你要搞清楚,在python中“=”是赋予的意思,“==”才是等于的意思
其次,把x[:]放在=左边和直接写 ...

首先,我理解“=”和“==”的区别。不过你说的“应该会执行不同操作”确实提醒了我,确实是我在分析x[:] = x[::-1]的时候想错了对应的底层方法。

我按照C语言的思路先看等号左边再看等号右边,最后用等号赋值,但这个顺序是错的。
如果按照C的顺序,那么x[:]会返回一个新的列表对象,x[::-1]同样如此。如此一来就会变成两个列表赋值,也就是[1, 2, 3] = [3, 2, 1],而这在语法上是错误的,不论是C还是Python都是错误的。

你说的“应该会执行不同操作”让我突然意识到此处要把等号和左边的部分看作一个整体,换言之此处就只是给x中的元素赋值而已。底层调用的魔法方法是这样的:
x = [1, 2, 3]
x.__setitem__(slice(None, None), x.__getitem__(slice(None, None, -1)))
所以虽然我没有混淆“=”与“==”,但是我把“给列表中的元素赋值”与“给变量重新赋值”混淆了。感谢提醒~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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