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 输出一个两行字符的变量
Feb 05 Python
Python中多线程及程序锁浅析
Jan 21 Python
对于Python中线程问题的简单讲解
Apr 03 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
python交互式图形编程实例(二)
Nov 17 Python
Python遍历pandas数据方法总结
Feb 09 Python
python使用jieba实现中文分词去停用词方法示例
Mar 11 Python
Python实现字典(dict)的迭代操作示例
Jun 05 Python
如何不用安装python就能在.NET里调用Python库
Jul 12 Python
浅析Python3 pip换源问题
Jan 06 Python
python cookie反爬处理的实现
Nov 01 Python
Python3.9.0 a1安装pygame出错解决全过程(小结)
Feb 02 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
【COS正片】蕾姆睡衣cos,纯洁可爱被治愈了 cn名濑弥七
2020/03/02 日漫
在Mac上编译安装PHP7的开发环境
2015/07/28 PHP
php中html_entity_decode实现HTML实体转义
2018/06/13 PHP
javascript语句中的CDATA标签的意义
2007/05/09 Javascript
jQuery 注意事项 与原因分析
2009/04/24 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
JavaScript实现继承的4种方法总结
2014/10/16 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
程序员必知35个jQuery 代码片段
2015/11/05 Javascript
文本框只能输入数字的js代码(含小数点)
2016/07/10 Javascript
js replace()去除代码中空格的实例
2017/02/14 Javascript
vue实现百度搜索下拉提示功能实例
2017/06/14 Javascript
详解vue+webpack+express中间件接口使用
2018/07/17 Javascript
微信小程序url传参写变量的方法
2018/08/09 Javascript
微信小程序实现预览图片功能
2020/10/22 Javascript
ES6 新增的创建数组的方法(小结)
2019/08/01 Javascript
Jquery+AJAX实现无刷新上传并重命名文件操作示例【PHP后台接收】
2020/05/29 jQuery
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
如何使用JavaScript实现无缝滚动自动播放轮播图效果
2020/08/20 Javascript
antd-日历组件,前后禁止选择,只能选中间一部分的实例
2020/10/29 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
Python字符遍历的艺术
2008/09/06 Python
python插入排序算法实例分析
2015/07/03 Python
Python 根据日志级别打印不同颜色的日志的方法示例
2019/08/08 Python
Django如何使用redis作为缓存
2020/05/21 Python
tensorflow dataset.shuffle、dataset.batch、dataset.repeat顺序区别详解
2020/06/03 Python
Python函数参数定义及传递方式解析
2020/06/10 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
CSS3轻松实现圆角效果
2017/11/09 HTML / CSS
html5新特性与用法大全
2018/09/13 HTML / CSS
MANGO官方网站:西班牙芒果服装品牌
2017/01/15 全球购物
法警的竞聘演讲稿
2014/01/02 职场文书
党支部承诺书
2015/01/20 职场文书
2015年工会工作总结范文
2015/07/23 职场文书
redis 查看所有的key方式
2021/05/07 Redis
解决spring.thymeleaf.cache=false不起作用的问题
2022/06/10 Java/Android