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 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
Python实现爬取需要登录的网站完整示例
Aug 19 Python
Python对List中的元素排序的方法
Apr 01 Python
python email smtplib模块发送邮件代码实例
Apr 26 Python
详谈Python 窗体(tkinter)表格数据(Treeview)
Oct 11 Python
Linux下Python安装完成后使用pip命令的详细教程
Nov 22 Python
Python函数和模块的使用总结
May 20 Python
Puppeteer使用示例详解
Jun 20 Python
PyQt Qt Designer工具的布局管理详解
Aug 07 Python
基于YUV 数据格式详解及python实现方式
Dec 09 Python
Python如何优雅删除字符列表空字符及None元素
Jun 25 Python
Python持续监听文件变化代码实例
Jul 22 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 autoload机制的详解
2013/06/09 PHP
php数组查找函数总结
2014/11/18 PHP
PHP实现链式操作的三种方法详解
2017/11/16 PHP
PHP7 echo和print语句实例用法
2019/02/15 PHP
Using the TextRange Object
2006/10/14 Javascript
JQuery获取各种宽度、高度(format函数)实例
2013/03/04 Javascript
AngularJS入门教程之双向绑定详解
2016/08/18 Javascript
Bootstrap下拉菜单样式
2017/02/07 Javascript
angular实现IM聊天图片发送实例
2017/05/08 Javascript
js实现Tab选项卡切换效果
2020/07/17 Javascript
浅谈在vue中用webpack打包之后运行文件的问题以及相关配置方法
2018/02/21 Javascript
MVVM 双向绑定的实现代码
2018/06/21 Javascript
小程序实现展开/收起的效果示例
2018/09/22 Javascript
node.js使用net模块创建服务器和客户端示例【基于TCP协议】
2020/02/14 Javascript
Jquery 获取相同NAME 或者id删除行操作
2020/08/24 jQuery
用实例解释Python中的继承和多态的概念
2015/04/27 Python
Python中特殊函数集锦
2015/07/27 Python
详解Python map函数及Python map()函数的用法
2017/11/16 Python
Python实现的当前时间多加一天、一小时、一分钟操作示例
2018/05/21 Python
Python中Numpy包的安装与使用方法简明教程
2018/07/03 Python
对python打乱数据集中X,y标签对的方法详解
2018/12/14 Python
python中bytes和str类型的区别
2019/10/21 Python
Python如何输出百分比
2020/07/31 Python
python 5个顶级异步框架推荐
2020/09/09 Python
日本最大的彩色隐形眼镜销售网站:CharmColor
2020/09/09 全球购物
Linux如何为某个操作添加别名
2015/02/05 面试题
《雾凇》教学反思
2014/02/17 职场文书
大学学习计划书范文
2014/05/02 职场文书
大型演出策划方案
2014/05/28 职场文书
生产助理岗位职责
2014/06/18 职场文书
机关单位工作失职检讨书
2014/11/20 职场文书
2014年共青团工作总结
2014/12/10 职场文书
管理失职检讨书
2015/05/05 职场文书
2015年房产销售工作总结范文
2015/05/22 职场文书
试用期转正工作总结2015
2015/05/28 职场文书
春风化雨观后感
2015/06/11 职场文书