python 如何快速复制序列


Posted in Python onSeptember 07, 2020

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),任意三个标记形成一条直线,则为获胜。

python 如何快速复制序列

(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 = ['_'] * 3
  board.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 如何快速复制序列的详细内容,更多关于python 复制序列的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
python 正则式使用心得
May 07 Python
Python自动连接ssh的方法
Mar 07 Python
python自动格式化json文件的方法
Mar 11 Python
python编程开发之类型转换convert实例分析
Nov 13 Python
Django模板变量如何传递给外部js调用的方法小结
Jul 24 Python
selenium+python自动化测试之环境搭建
Jan 23 Python
Python爬虫 批量爬取下载抖音视频代码实例
Aug 16 Python
opencv 图像礼帽和图像黑帽的实现
Jul 07 Python
Java爬虫技术框架之Heritrix框架详解
Jul 22 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
Jul 28 Python
Python 如何在字符串中插入变量
Aug 01 Python
python中用Scrapy实现定时爬虫的实例讲解
Jan 18 Python
Python2与Python3关于字符串编码处理的差别总结
Sep 07 #Python
python 装饰器的实际作用有哪些
Sep 07 #Python
通俗讲解python 装饰器
Sep 07 #Python
彻底搞懂python 迭代器和生成器
Sep 07 #Python
python如何设置静态变量
Sep 07 #Python
获取CSDN文章内容并转换为markdown文本的python
Sep 06 #Python
浅谈Python描述数据结构之KMP篇
Sep 06 #Python
You might like
php 方便水印和缩略图的图形类
2009/05/21 PHP
学习php设计模式 php实现原型模式(prototype)
2015/12/07 PHP
PHP读取CSV大文件导入数据库的实例
2017/07/24 PHP
javascript 常用方法总结
2009/06/03 Javascript
一个JS小玩意 几个属性相加不能超过一个特定值.
2009/09/29 Javascript
firefox事件处理之自动查找event的函数(用于onclick=foo())
2010/08/05 Javascript
jQuery1.6 正式版发布并提供下载
2011/05/05 Javascript
HTML页面登录时的JS验证方法
2014/05/28 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
果断收藏9个Javascript代码高亮脚本
2016/01/06 Javascript
TypeScript Type Innference(类型判断)
2016/03/10 Javascript
老生常谈JQuery data方法的使用
2016/09/09 Javascript
JS实现焦点图轮播效果的方法详解
2016/12/19 Javascript
使用jquery的jsonp如何发起跨域请求及其原理详解
2017/08/17 jQuery
自定义vue组件发布到npm的方法
2018/05/09 Javascript
Angularjs实现多图片上传预览功能
2018/07/18 Javascript
Vue实现表格批量审核功能实例代码
2019/05/28 Javascript
Python迭代器和生成器介绍
2015/03/06 Python
python开发之IDEL(Python GUI)的使用方法图文详解
2015/11/12 Python
全面了解Python的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
彻底搞懂Python字符编码
2018/01/23 Python
详解Python中的各种转义符\n\r\t
2019/07/10 Python
Python编程中类与类的关系详解
2019/08/08 Python
Python numpy线性代数用法实例解析
2019/11/15 Python
解决pycharm中导入自己写的.py函数出错问题
2020/02/12 Python
Dyson加拿大官方网站:购买戴森吸尘器,风扇,冷热器及配件
2016/10/26 全球购物
波兰多品牌运动商店:StreetStyle24.pl
2020/09/22 全球购物
super()与this()的区别
2016/01/17 面试题
建材业务员岗位职责
2013/12/08 职场文书
高中自我鉴定
2013/12/20 职场文书
机械专业求职信
2014/05/25 职场文书
大学生社会实践活动总结报告
2015/05/06 职场文书
保险公司岗前培训工作总结
2015/10/24 职场文书
党员理论学习心得体会
2016/01/21 职场文书
2019客服个人年终工作总结范文
2019/07/08 职场文书
JDK8中String的intern()方法实例详细解读
2022/09/23 Java/Android