鱼C论坛

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

课后作业求助~~~~~

[复制链接]
发表于 2019-7-1 14:30:50 | 显示全部楼层 |阅读模式

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

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

x
python 第十二讲的课后作业答案写着:
>>> old = [1, 2, 3, 4, 5]
>>> new = old
>>> old = [6]
>>> print(new)
复制代码

会打印:[1, 2, 3, 4, 5]

这个不应该是打印[6]吗,如果是赋值的情况,原来的列表改变,赋值的列表不应该也改变吗??
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-7-1 14:39:39 | 显示全部楼层
python的赋值可以想象为贴标签。
>>> old = [1, 2, 3, 4, 5] #在地址1处放置列表[1, 2, 3, 4, 5] ,并给它贴上标签old
>>> new = old #再次给它贴上标签new
>>> old = [6] #注意这里!在地址2处放置列表[6],把标签old从地址1处取下,重新帖子地址2处
>>> print(new) #new还是指向地址1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2019-7-1 15:04:55 | 显示全部楼层
冬雪雪冬 发表于 2019-7-1 14:39
python的赋值可以想象为贴标签。
>>> old = [1, 2, 3, 4, 5] #在地址1处放置列表[1, 2, 3, 4, 5] ,并给它 ...

理解了!谢谢解答!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-1 15:08:22 | 显示全部楼层
我们这样来看,
  1. >>> old = [1, 2, 3, 4, 5]
  2. >>> new = old
  3. >>> id(old), id(new) # 通过ID来查看对象的内存地址,发现new和old地址都一样
  4. (12306232, 12306232)
  5. >>> old = [6]
  6. >>> id(old) # 但是经过[6]赋值后,发现old的地址被改为了一个新的地方,所以输出结果肯定是不一样的
  7. 42900336
复制代码

那么我要怎样做才能一样呢?有办法吗?有的,我们用__init__魔法方法在原来的地址上重新初始化一下
  1. >>> old = [1, 2, 3, 4, 5]
  2. >>> new = old
  3. >>> id(old), id(new)
  4. (12304672, 12304672)
  5. >>> old.__init__([6])
  6. >>> id(old), id(new)
  7. (12304672, 12304672)
  8. >>> print(new)
  9. [6]
  10. >>>
复制代码

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

使用道具 举报

发表于 2019-7-1 15:33:35 | 显示全部楼层
newu 发表于 2019-7-1 15:08
我们这样来看,

那么我要怎样做才能一样呢?有办法吗?有的,我们用__init__魔法方法在原来的地址上重新 ...

能详细讲讲这个用法的原理吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-7-3 12:32:18 | 显示全部楼层
你应该去好好理解下列表在传递过程中,python为我们做了什么?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-16 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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