python 如何快速复制序列

作者:deniro 时间:2022-12-04 05:20:36 

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)

来源:https://juejin.im/post/6869205338533396487?utm_source=tuicool&utm_medium=referral

标签:python,序列
0
投稿

猜你喜欢

  • Python新手如何进行闭包时绑定变量操作

    2021-05-01 15:23:55
  • asp开发Wap中的随笔

    2008-05-21 12:56:00
  • Python 文件与文件对象及文件打开关闭

    2021-06-16 16:08:44
  • 启动iis出现发生意外0x8ffe2740的解决方法

    2011-03-31 11:19:00
  • wdcp添加tomcat,同时支持php和java教程

    2023-10-09 10:39:38
  • 详解Python编程中time模块的使用

    2023-08-29 16:57:08
  • sql添加数据后返回受影响行数据

    2011-11-03 17:18:18
  • 学ASP应该注意ASP程序书写的规范标准

    2008-10-17 10:16:00
  • vuejs实现下拉框菜单选择

    2023-09-23 08:49:54
  • ACCESS入门教程:初识Access 2000

    2008-01-03 19:42:00
  • Python数据结构之优先级队列queue用法详解

    2023-03-10 03:37:40
  • Python深度学习albumentations数据增强库

    2023-02-14 20:00:18
  • 网页设计软件FrontPage快捷键一览

    2008-02-24 16:55:00
  • asp正则表达式详细说明

    2008-10-23 16:23:00
  • ASP格式化日期的函数(输出13种样式)

    2011-07-12 20:22:00
  • PHP实现绘制二叉树图形显示功能详解【包括二叉搜索树、平衡树及红黑树】

    2023-07-23 02:36:20
  • python实现基于两张图片生成圆角图标效果的方法

    2023-04-20 17:58:56
  • python django框架中使用FastDFS分布式文件系统的安装方法

    2022-02-25 21:27:33
  • 详解Python IO编程

    2021-06-26 08:40:48
  • 十万条Access数据表分页的两个解决方法

    2008-05-23 18:24:00
  • asp之家 网络编程 m.aspxhome.com