鱼C论坛

 找回密码
 立即注册
查看: 1418|回复: 5

[已解决]第十三讲中关于分片拷贝list的疑惑

[复制链接]
发表于 2018-1-24 05:16:54 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 我最怕起名字 于 2018-1-24 17:43 编辑

关于这个部分
list7 =list6[:]
list8 = list6
当对list6进行改变之后,list7依旧等于变更前的list6,这个我能理解,说是分片拷贝重新开辟了内存地址。但是为什么list8会随着list6的改变而跟着一起改变呢?

这跟之前的认知不符,比如
a = 8
b = a
a = 9
print(b)
这个时候b的结果依然是8,并没有随着a的改变而改变。关于这里,我记得刚开始的讲解是,8在内存中的地址是固定的,除非没有被引用而被释放再重新写入,当改变a的数据,会重新开辟新的内存地址来存放a的数据,然后将a指向新开辟内存地址,而不会改变之前的8,所以b依然是8。但为什么今天这个不一样了??求解惑
最佳答案
2018-1-24 09:56:17
.sort()函数并不改变列表指向地址,你把列表重新赋值,用id(list6),id(list8)就知道赋值重新初始化地址就会跑了
QQ截图20180124050334.png
QQ截图20180124050352.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2018-1-24 09:12:26 | 显示全部楼层
python中变量名只是标签而已,可以多个标签指向同一块内存
new=old
意味着new和old这两个标签指向了同一块内存
所以你对new和old指向的数据进行改动,比如列表的pop,sort,reverse等操作都会对两者同时产生作用,因为他们修改了内存中的数据
而你将old重新赋值,意味着old标签指向另外一块内存,从此old和new再无瓜葛
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-24 09:56:17 | 显示全部楼层    本楼为最佳答案   
.sort()函数并不改变列表指向地址,你把列表重新赋值,用id(list6),id(list8)就知道赋值重新初始化地址就会跑了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 17:40:23 | 显示全部楼层
塔利班 发表于 2018-1-24 09:56
.sort()函数并不改变列表指向地址,你把列表重新赋值,用id(list6),id(list8)就知道赋值重新初始化地址就会 ...

我明白了,之前的
a = 8
b = a  
a = 9
这个时候,改变a数据会把a指向新的内存地址,而不是原地修改“8”,所以b不受到影响,但是.sort函数他是原地修改的,不会指向新的内存地址,所以其他所有的指向这个地址的变量都随着一起改变。
理解没问题吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-24 17:42:58 | 显示全部楼层
BngThea 发表于 2018-1-24 09:12
python中变量名只是标签而已,可以多个标签指向同一块内存
new=old
意味着new和old这两个标签指向了同一 ...

明白了明白了,sort()等函数操作是修改了当天内存地址中的数据,而不会指向新的地址。所以所有指向这个地址的变量都随之改变。但是赋值操作是指向新的内存地址,所以不改变原有的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-24 17:43:40 | 显示全部楼层
我最怕起名字 发表于 2018-1-24 17:40
我明白了,之前的
a = 8
b = a  

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-6 06:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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