今天在创建嵌套列表时遇到一个问题,决定看看到底是谁在背后捣鬼

>>> board1 = [[0]*3 for _ in range(3)]
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board2 = [[0]*3]*3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]

没错,看起来两种方法都可以创建嵌套列表,但是赋值的时候却出现了问题

>>> board1[1][1] = 1
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]
>>> board2[1][1] = 1
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

查阅资料,发现这是 board2 列表内的 3 个引用指向同一个对象的原因。作为一只菜鸟,仍然不解其意,又看到了下面的例子

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> board3 = []
>>> for i in range(3):
...     row=[0] * 3
...     board3.append(row)
...
>>> board3
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board3[1][1] = 1
>>> board3
[[0, 0, 0], [0, 1, 0], [0, 0, 0]]

board3 和 board1 是一样的,每次迭代新建了一个列表,意味着列表的每行指向不同的地址。

再看下面的例子

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
>>> board4 = []
>>> row=[0] * 3
>>> for i in range(3):
...     board4.append(row)
>>> board4
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
>>> board4[1][1] = 1
>>> board4
[[0, 1, 0], [0, 1, 0], [0, 1, 0]]

board4 和 board2 是一样的,每次迭代都添加同一个对象到列表,意味着列表的每行指向了同一块地址。
为什么会这样?

这是引用和可变对象背后的原理和陷阱。

python 中默认是做浅复制,假如list1 是一个列表,list(list1) 或 list1[:] 都会创建 list1 的副本,它们做的是浅复制(只复制了最外层容器,副本中元素依然是源容器中元素的引用)。浅复制共享同一个列表对象

为了清楚的理解它们到底是如何运行的,我们将下面创建嵌套列表的过程进行可视化

board1 = [[0]*3 for _ in range(3)]
board1[1][1] = 1
board2 = [[0]*3]*3
board2[1][1] = 1

第一行:

首先创建一个可迭代对象,在循环体中创建[0]*3 赋值到新列表对应位置

可以看到,嵌套列表内每个子列表占用单独的空间,所以赋值操作 board1[1][1] = 1只会改变其中一个

第三行:

嵌套列表内的三个子列表指向同一个对象,所以赋值操作会造成我们最初看到的情形。

python嵌套列表知多少相关推荐

  1. python嵌套列表法实现树_python – 将嵌套的括号树转换为嵌套列表

    我有一个树结构文件,其中括号用于表示树.这是将代码转换为 python嵌套列表的代码 def foo(s): def foo_helper(level=0): try: token = next(to ...

  2. python嵌套列表操作方法_python中多层嵌套列表的拆分方法

    场景:有一个多层嵌套的列表如:[[23],[3,3],[22,22],1,123,[[123,a],2]] 拆分成: def splitlist(list): ''' 现有一个列表,里面元素包括 数字 ...

  3. Python嵌套列表解析式(又称列表推导式)写法剖析与应用举例

    #嵌套列表解析式又称嵌套列表推导式,功能非常强大,但是初学者难以摸清其书写规则. #以下实例展示了嵌套列表解析的写法. #嵌套列表解析表达是的书写规则是层层嵌套. #嵌套层的一般形式为:for out ...

  4. python嵌套列表操作_python 列表增删改查 嵌套 相关操作

    ---恢复内容开始--- 今日内容: 一.列表 1.  列列表的介绍        列列表是python的基础数据类型之⼀一 ,其他编程语⾔言也有类似的数据类型. 比如JS中的数 组, java中的数 ...

  5. python嵌套列表怎么遍历_Python中遍历列表,循环嵌套

    1.遍历列表中的元素:用for(操作元素)和while(操作索引)实现 #将列表中的所有元素打印出来 #for循环主要结合成员运算符使用,此时只能操作元素 list1= ["and" ...

  6. python嵌套列表操作_python基础(list列表的操作,公共方法,列表嵌套,元祖)...

    list 列表 索引,切片与str相同. 列表的操作(增删改查) 1,增加 .append() 追加,增加到最后 li = ['alex','wusir','egon','女神','taibai'] ...

  7. python嵌套列表索引 index_Python:嵌套lis中元素的索引列表

    在Python2.6或更高版本中next((i for i, sublist in enumerate(nested_list) if "a" in sublist), -1) 假 ...

  8. python嵌套列表元素和_Python嵌套列表内部比较和编辑

    a = [[1, 2, 4], [2, 5], [0, 3, 7, 8], [12, 3, 6], [18, 14]] result = [] for s in a: s = set(s) for t ...

  9. python嵌套列表字典_python中嵌套列表转为字典

    题目: # 有一组用例数据如下: cases = [ ['case_id', 'case_title', 'url', 'data', 'excepted'], [1, '用例1', 'www.bau ...

最新文章

  1. idea缩写快捷键_idea快捷键大全
  2. Java 8中处理集合的优雅姿势——Stream
  3. c语言uint赋值给int,如何在C#中将uint转换为int?
  4. [xmlpull]XmlPull常见错误
  5. 【机器学习实战】极大似然法
  6. 生成证书密钥RequestsDependencyWarning:Old version of cryptography ([1, 2, 3]) may cause slowdown.
  7. 最短路径问题(信息学奥赛一本通-T1342)
  8. 引入Vant-UI全部组件的代码 - (备份)
  9. 成都理工大学“自然地理学”专业转行AI之路(精彩直播回放)
  10. 阿里云主机(aliyun-Linux) x64安装Redis详解
  11. deploy owned private docker registry based on docker HUB registry image
  12. 帝国cms+php7.0+mysql_帝国cms切换php7.x登录后台空白解决方法
  13. Win10网络图标消失,网络图标变成灰色,打开网络设置闪退等问题解决
  14. mq消息队列到底是什么
  15. html知识点整理(全)
  16. HTTP基础知识(仅介绍涉及R语言爬虫部分)
  17. 文本框获取焦点后出现的边框,怎么去掉
  18. Linux内核配置选项详解
  19. STM8L101F3P6低功耗
  20. 个人理解,关于python 的__init__.py 以及 __all__ 的用法

热门文章

  1. rac环境改动spfile后遭遇ora-29250小例
  2. Java内存模型的历史变迁
  3. 架设搭建开源搜索服务器 - Sphinx/Coreseek 安裝
  4. 【AaronYang风格】第一篇 CodeFirst 初恋
  5. Windows 8 Hello World
  6. IT容灾系统周期管理图
  7. jquery ajax设置头部,jQuery Ajax 设置请求头
  8. 【性能优化】EKPO/EKBE和LIPS做JOIN的问题
  9. 前驱、后驱和四驱,究竟哪个好?
  10. 调用BAPI_MATERIAL_SAVEDATA批量创建/修改物料