说说在 Python 中如何快速复制序列
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 中如何快速复制序列相关推荐
- 第一章:Python的基本数据类型-第二节:Python中表示“有序”(序列)的数据类型
部分参考:菜鸟教程 文章目录 一:列表 (1)列表基本操作 A:元素访问 B:常用操作 C:函数和方法总结 (2)其他使用技巧 二:元组 (1)元组基本操作 A:元素访问 B:常用操作 C:常用函数方 ...
- Python中list的复制及深拷贝与浅拷贝探究
在Python中,经常要对一个list进行复制.对于复制,自然的就有深拷贝与浅拷贝问题.深拷贝与浅拷贝的区别在于,当从原本的list复制出的list之后,修改其中的任意一个是否会对另一个造成影响,即这 ...
- python中用于生成数字序列的函数_Python中的生成器?
自从PEP 255引入以来,生成器就一直是python的重要组成部分. python中的Generator是一种特殊的例程,可用于控制循环的迭代行为.生成器类似于返回数组的函数.生成器具有参数,我们可 ...
- Python中的浅复制(shallow copy)和深复制(deep copy)
文章目录 python值管理方式 深复制与浅复制的使用及区别 近期杂事太多,博客一直没更新,9月最后一天了,总得写点吧 今天记一下以前碰到过,最近又碰到的问题:python的深复制和浅复制 神奇的py ...
- Python中的文件复制
1 致谢 感谢网友keeptg的帮助, 原文链接如下: https://www.cnblogs.com/keeptg/p/10944109.html 1 前言 最近在学习车道线检测的知识,在制作数据集 ...
- [转载] python 中numpy快速去除nan, inf的方法
参考链接: Python中的numpy.isinf 参考文献Python快速转换numpy数组中Nan和Inf的方法 在使用numpy数组的过程中时常会出现nan或者inf的元素,可能会造成数值计算时 ...
- python中如何实现复制粘贴_复制粘贴功能的Python程序 python 中如何实现
python 中如何实现对文件的复制.粘贴虽然小编心有不甘,可是小编也明白,这辈子就只能陪你到这了. 比如说:小编想将"c:\123\1.txt"复制到"d:\新建文件夹 ...
- python中如何实现复制粘贴_引子,Python中PyQt5实现复制粘贴,程序界面如何访问系统剪贴板...
前面内容,我们介绍了PyQt5中一些基本控件及常用的绘图设备类 Python中PyQt5如何打印图像界面,基本控件应用,QPrinter类详解 Python用PyQt5制作窗体状态栏,基本控件QSta ...
- Photoshop中的快速复制
在Photoshop中也有快速复制的方法,我首先说的是用选取画的元素的快速复制的方法: 首先新建图层用选取画一个矩形随便填个颜色:在这里我填的黑色如下: 然后选中此图层,在这里我的是图层二,按下快捷键 ...
最新文章
- IDEA使用GIT插件上传到码云git@OSC的方法
- 【原】iOS:手把手教你发布代码到CocoaPods(Trunk方式)
- ltrim函数_MySQL|trim() 函数用法
- 嵌入式电路设计(工具准备)
- python爬虫案例——csdn数据采集
- AD19妙用SHIFT+S查找没连的线
- PAT (Basic Level) Practice1019 数字黑洞
- 单片机c语言实习报告,单片机C语言程序设计实训100例.pdf
- android采集声卡,农步祥作品 - Android系统下使用USB声卡音质测评报告 [Soomal]
- python单例模式解析_深度解密Python单例模式
- 【R语言】常用的R语言数据挖掘包
- Windows CMD DOS命令
- Linux,Centos下 Tomcat8 修改jvm内存配置的新方法
- 工业级环网交换机是什么呢?它又有什么作用
- 广告位招租C: City
- 软件工程未来发展方向
- 这些年我用过的 6个API 接口文档平台,真的好用
- 【杰理AC632n】IIC-VCNL36826S
- 毕设项目 - 基于SSM的网上购物商城(含源码+论文)
- mysql每隔俩小时、四小时、八小时进行数据统计
热门文章
- Asp.net页面之间传递参数的几种方法
- js原型和原型链_理解JS中的原型和原型链
- ElasticSearch suggester
- qt与JAVA服务器通信_Qt实现的SSL通信客户端和服务器
- java 和_java中的和=是什么意思
- 日志分析系统分类有哪些_什么是网站日志分析需要分析哪些内容
- 1007.422通信问题
- session失效_Session的销毁方式到底有哪些?
- c++ 游戏_C/C++编程笔记:C语言实现连连看游戏,项目源码分享
- Ubuntu下构建gstreamer开发环境