1 基本用法

把序列乘以一个整数,就会产生一个新序列。这个新序列是原始序列复制了整数份,然后再拼接起来的结果。

l=[1,2,3]
l2=l * 3
logging.info('l2 -> %s',l2)
l3=5 * 'deniro'
logging.info('l3 -> %s',l3)

运行结果:

INFO - l2 -> [1, 2, 3, 1, 2, 3, 1, 2, 3]
INFO - l3 -> denirodenirodenirodenirodeniro

* 复制语法不会修改原有的操作对象,而是构建出一个全新的序列。

2 列表陷阱

a * n 语法中,a 为列表,n 为需要复制的列表数。如果 a 列表中的元素是基本类型的话,没什么问题。但如果 a 列表中的元素是对象的引用的话,那么这些复制出来的列表中的引用其实指向的是同一个引用。

Luciano Ramalho 举了一个井字棋示例。

井字棋,英文名叫Tic-Tac-Toe,是一种在3*3格子上进行的连珠游戏,和五子棋类似,由于棋盘一般不画边框,格线排成井字故得名。游戏需要的工具仅为纸和笔,然后由分别代表O和X的两个游戏者轮流在格子里留下标记(一般来说先手者为X),任意三个标记形成一条直线,则为获胜。

(1)错误示例 1

weird_board = [['_'] * 3] * 3
logging.info('weird_board -> %s', weird_board)
weird_board[1][2] = 'X'
logging.info('weird_board -> %s', weird_board)

运行结果:

INFO - weird_board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - weird_board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

可以看到虽然代码中只修改了 [1][2] 位置的值,但却影响到了三处地方。这就说明这三处其实指向的是同一个引用。

(2)错误示例 2

这个示例犯的错与前一个示例相同,都是把同一个对象追加到同一块游戏板中(board)。

row = ['_'] * 3
board = []
for i in range(3):board.append(row)
logging.info('board -> %s', board)
board[1][2] = 'X'
logging.info('board -> %s', board)

运行结果:

INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]

(3)正确示例

对示例 2 进行改造,就可以避免上述问题。

board = []
for i in range(3):row = ['_'] * 3board.append(row)
logging.info('board -> %s', board)
board[1][2] = 'X'
logging.info('board -> %s', board)

运行结果:

INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
INFO - board -> [['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]

这里把 row = ['_'] * 3 放入 for 循环中,这样每一次循环都会新建一个 row,然后再放入游戏板中。这样游戏板中的每一个单元格都是独立的,互不影响。

利用列表推导方法,还可以简化示例代码:

board = [['_'] * 3 for i in range(3)]
logging.info('board -> %s', board)board[1][2] = 'X'
logging.info('board -> %s', board)

本文首发于python黑洞网,csdn同步跟新

说说在 Python 中如何快速复制序列相关推荐

  1. 第一章:Python的基本数据类型-第二节:Python中表示“有序”(序列)的数据类型

    部分参考:菜鸟教程 文章目录 一:列表 (1)列表基本操作 A:元素访问 B:常用操作 C:函数和方法总结 (2)其他使用技巧 二:元组 (1)元组基本操作 A:元素访问 B:常用操作 C:常用函数方 ...

  2. Python中list的复制及深拷贝与浅拷贝探究

    在Python中,经常要对一个list进行复制.对于复制,自然的就有深拷贝与浅拷贝问题.深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这 ...

  3. python中用于生成数字序列的函数_Python中的生成器?

    自从PEP 255引入以来,生成器就一直是python的重要组成部分. python中的Generator是一种特殊的例程,可用于控制循环的迭代行为.生成器类似于返回数组的函数.生成器具有参数,我们可 ...

  4. Python中的浅复制(shallow copy)和深复制(deep copy)

    文章目录 python值管理方式 深复制与浅复制的使用及区别 近期杂事太多,博客一直没更新,9月最后一天了,总得写点吧 今天记一下以前碰到过,最近又碰到的问题:python的深复制和浅复制 神奇的py ...

  5. Python中的文件复制

    1 致谢 感谢网友keeptg的帮助, 原文链接如下: https://www.cnblogs.com/keeptg/p/10944109.html 1 前言 最近在学习车道线检测的知识,在制作数据集 ...

  6. [转载] python 中numpy快速去除nan, inf的方法

    参考链接: Python中的numpy.isinf 参考文献Python快速转换numpy数组中Nan和Inf的方法 在使用numpy数组的过程中时常会出现nan或者inf的元素,可能会造成数值计算时 ...

  7. python中如何实现复制粘贴_复制粘贴功能的Python程序 python 中如何实现

    python 中如何实现对文件的复制.粘贴虽然小编心有不甘,可是小编也明白,这辈子就只能陪你到这了. 比如说:小编想将"c:\123\1.txt"复制到"d:\新建文件夹 ...

  8. python中如何实现复制粘贴_引子,Python中PyQt5实现复制粘贴,程序界面如何访问系统剪贴板...

    前面内容,我们介绍了PyQt5中一些基本控件及常用的绘图设备类 Python中PyQt5如何打印图像界面,基本控件应用,QPrinter类详解 Python用PyQt5制作窗体状态栏,基本控件QSta ...

  9. Photoshop中的快速复制

    在Photoshop中也有快速复制的方法,我首先说的是用选取画的元素的快速复制的方法: 首先新建图层用选取画一个矩形随便填个颜色:在这里我填的黑色如下: 然后选中此图层,在这里我的是图层二,按下快捷键 ...

最新文章

  1. IDEA使用GIT插件上传到码云git@OSC的方法
  2. 【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
  3. ltrim函数_MySQL|trim() 函数用法
  4. 嵌入式电路设计(工具准备)
  5. python爬虫案例——csdn数据采集
  6. AD19妙用SHIFT+S查找没连的线
  7. PAT (Basic Level) Practice1019 数字黑洞
  8. 单片机c语言实习报告,单片机C语言程序设计实训100例.pdf
  9. android采集声卡,农步祥作品 - Android系统下使用USB声卡音质测评报告 [Soomal]
  10. python单例模式解析_深度解密Python单例模式
  11. 【R语言】常用的R语言数据挖掘包
  12. Windows CMD DOS命令
  13. Linux,Centos下 Tomcat8 修改jvm内存配置的新方法
  14. 工业级环网交换机是什么呢?它又有什么作用
  15. 广告位招租C: City
  16. 软件工程未来发展方向
  17. 这些年我用过的 6个API 接口文档平台,真的好用
  18. 【杰理AC632n】IIC-VCNL36826S
  19. 毕设项目 - 基于SSM的网上购物商城(含源码+论文)
  20. mysql每隔俩小时、四小时、八小时进行数据统计

热门文章

  1. Asp.net页面之间传递参数的几种方法
  2. js原型和原型链_理解JS中的原型和原型链
  3. ElasticSearch suggester
  4. qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
  5. java 和_java中的和=是什么意思
  6. 日志分析系统分类有哪些_什么是网站日志分析需要分析哪些内容
  7. 1007.422通信问题
  8. session失效_Session的销毁方式到底有哪些?
  9. c++ 游戏_C/C++编程笔记:C语言实现连连看游戏,项目源码分享
  10. Ubuntu下构建gstreamer开发环境