鱼C论坛

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

[已解决]012讲的一个小问题

[复制链接]
发表于 2019-2-15 23:42:50 | 显示全部楼层 |阅读模式

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

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

x
  1. >>> old = [1, 2, 3, 4, 5]
  2. >>> new = old
  3. >>> old = [6]
  4. >>> print(new)
复制代码

为啥这段代码输出的结果是[1,2,3,4,5]呢?
不是说new = old,那么new指向的便是old这个对象,按理来说,new应该随着old的改变而改变啊?为什么结果不会随着old改变?
难道是new指向的只是new的[1,2,3,4,5],所以old改变了,new就没有改变吗?
最佳答案
2019-2-16 11:33:53
首先,你定义old = [1, 2, 3, 4, 5],
打个比方:这就好像是将[1, 2, 3, 4, 5]作为宾馆的住户,存到房间里,
old只是一个指向该房间的标签,也就是门牌号。
你这时令 new = old ,其实并不是像你理解的:“new作为old的一个标签",而是new也作为标签指向[1, 2, 3, 4, 5]所在的房间号。
实际上 new = old , 只是把old所表示的对[1, 2, 3, 4, 5]引用浅拷贝了给了new标签。
所以你改变old标签的指向,和new没有关系,他们俩并不是相互包含或者等价关系。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-2-16 00:00:31 | 显示全部楼层
  1. old = [6]
复制代码

这句,这句已经使old指向一个新的列表了

执行效果是下面这样
  1. Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:05:16) [MSC v.1915 32 bit (Intel)] on win32
  2. Type "help", "copyright", "credits" or "license" for more information.
  3. >>> old = [1, 2, 3, 4, 5]
  4. >>> new = old
  5. >>> id(new)
  6. 17774032
  7. >>> id(old)
  8. 17774032
  9. >>> old = [6]
  10. >>> id(old)
  11. 17775192
  12. >>>
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

发表于 2019-2-16 08:43:08 | 显示全部楼层
关于这种题目的思路可以参考这个帖子:戳我前进
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-16 11:33:53 | 显示全部楼层    本楼为最佳答案   
首先,你定义old = [1, 2, 3, 4, 5],
打个比方:这就好像是将[1, 2, 3, 4, 5]作为宾馆的住户,存到房间里,
old只是一个指向该房间的标签,也就是门牌号。
你这时令 new = old ,其实并不是像你理解的:“new作为old的一个标签",而是new也作为标签指向[1, 2, 3, 4, 5]所在的房间号。
实际上 new = old , 只是把old所表示的对[1, 2, 3, 4, 5]引用浅拷贝了给了new标签。
所以你改变old标签的指向,和new没有关系,他们俩并不是相互包含或者等价关系。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-16 15:37:35 | 显示全部楼层
首先你要知道每个数据(列表,元组等)都有一个id,可以理解为储存的位置,每个id只对应一个数据
>>> old = [1, 2, 3, 4, 5]       #给列表贴一个名为old的标签,使用print(id(old))查看这个列表的id,设为id1
>>> new = old                    #这一步本质是new = [1,2,3,4,5],因为old和new其实只是标签作用,所以查看print(id(new))查看new的id2会发现id2=id1
new = old   不是这new这个标签会跟着old这个标签变化,他们只是标签,并不能代表数据,标签变化,数据是不会变的
>>> old = [6]                      #这一步是把old标签给了[6]这个列表,可以查看old的id变为id3 ,id3不等于id1,再查看new的id还是id2没变
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-2-16 16:29:17 | 显示全部楼层
old被重新赋值了,就是指向了新的值。如果没有被重新赋值,只是在原有基础进行变化的话,new就会和old一起变化。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-15 03:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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