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模糊查询本地文件夹去除文件后缀的实例(7行代码)
Nov 09 Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 Python
Django logging配置及使用详解
Jul 23 Python
树莓派极简安装OpenCv的方法步骤
Oct 10 Python
Python的缺点和劣势分析
Nov 19 Python
Python之——生成动态路由轨迹图的实例
Nov 22 Python
Python使用正则实现计算字符串算式
Dec 29 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
Apr 08 Python
python实现126邮箱发送邮件
May 20 Python
解决阿里云邮件发送不能使用25端口问题
Aug 07 Python
python中判断数字是否为质数的实例讲解
Dec 06 Python
Django cookie和session的应用场景及如何使用
Apr 29 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防CC攻击实现代码
2011/12/29 PHP
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
WordPress的文章自动添加关键词及关键词的SEO优化
2016/03/01 PHP
完美解决JS中汉字显示乱码问题(已解决)
2006/12/27 Javascript
in.js 一个轻量级的JavaScript颗粒化模块加载和依赖关系管理解决方案
2011/07/26 Javascript
JavaScript 类型的包装对象(Typed Wrappers)
2011/10/27 Javascript
JS获取DropDownList的value值与text值的示例代码
2014/01/07 Javascript
关于javaScript注册click事件传递参数的不成功问题
2014/07/18 Javascript
jquery实现仿新浪微博评论滚动效果
2015/08/06 Javascript
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
jquery实现可自动收缩的TAB网页选项卡代码
2015/09/06 Javascript
jQuery使用$.ajax提交表单完整实例
2015/12/11 Javascript
详解jQuery Mobile自定义标签
2016/01/06 Javascript
Windows 系统下设置Nodejs NPM全局路径
2016/04/26 NodeJs
Bootstrap源码解读导航条(7)
2016/12/23 Javascript
js实现短信发送倒计时功能(正则验证)
2017/02/10 Javascript
vue中如何让子组件修改父组件数据
2018/06/14 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
[01:51]DAC趣味视频-如何成为职业选手.mp4
2017/04/02 DOTA
[04:14]从西雅图到上海——玩家自制DOTA2主题歌曲应援TI9
2019/07/11 DOTA
Python的Bottle框架中实现最基本的get和post的方法的教程
2015/04/30 Python
python调用c++ ctype list传数组或者返回数组的方法
2019/02/13 Python
PYQT5开启多个线程和窗口,多线程与多窗口的交互实例
2019/12/13 Python
纯HTML+CSS3制作导航菜单(附源码)
2013/04/24 HTML / CSS
英国家喻户晓的高街品牌:River Island
2017/11/28 全球购物
荷兰街头时尚之家:Funkie House
2019/03/18 全球购物
J2EE的优越性主要表现在哪些方面
2016/03/28 面试题
司机的工作范围及职责
2013/11/13 职场文书
应届毕业生自我评价分享
2013/12/15 职场文书
亲子活动总结
2014/04/26 职场文书
财务稽核岗位职责
2015/04/13 职场文书
2015年幼儿园班务工作总结
2015/05/12 职场文书
python接口测试返回数据为字典取值方式
2022/02/12 Python
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js
JAVA springCloud项目搭建流程
2022/05/11 Java/Android