鱼C论坛

 找回密码
 立即注册
查看: 2410|回复: 4

列表的广播

[复制链接]
发表于 2016-6-6 17:28:29 | 显示全部楼层 |阅读模式

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

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

x
今天写码的时候发现一个问题,不太理解,望大家不吝赐教:
如果按照以下创建列表:
  1. list_1 = [[1]]*10000
  2. list_1[3] += [3]
复制代码

那么结果是:
  1. [[1,3],[1,3],......]
复制代码

稍微修改一下代码:
  1. list_2 = [[1],[1]]*5000
  2. list_2[3] += [2]
复制代码

结果变成了:
  1. [[1],[1,2],[1],[1,2],....]
复制代码

感觉是我对列表的广播理解不太正确,请大家帮忙解释以下这是为什么?
另外,如果我只想对列表的单一一个元素进行操作,要做怎样的修改?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-6-6 22:13:45 | 显示全部楼层
  1. list_1 = [[1] for i in range(10)]
  2. list_1[3] += [3]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-7 10:02:32 | 显示全部楼层

万分感谢!虽然我对这个问题的机理还是不太明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-6-7 10:48:03 | 显示全部楼层
holdme 发表于 2016-6-7 10:02
万分感谢!虽然我对这个问题的机理还是不太明白

这应该是python在定义列表的 * 操作时,使用的是浅拷贝,可以这样看一下
  1. a = [1,2]
  2. b = a
  3. print(id(a))
  4. print(id(b))
  5. b += [3]
  6. print(a,b)
复制代码
这就是一个浅拷贝,实际上a和b指向是同一个列表对象
在看你的代码,可以看成是:
  1. a = [[1],[1]]
  2. list_2 = a*5000
  3. list_2[3] += [2]
复制代码

其实在list_2中有的就是5000个a,他们地址都是相同的,都是一个列表
在你修改list_2[3]的时候也就是list_2中的第4个元素,实际上就是a的第二个元素,所以全部的a都改变了,就得到了你看到的结果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-6-7 10:49:46 | 显示全部楼层
挥舞乾坤 发表于 2016-6-7 10:48
这应该是python在定义列表的 * 操作时,使用的是浅拷贝,可以这样看一下这就是一个浅拷贝,实际上a和b指向是 ...

学习了,谢谢指点!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-21 06:38

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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