咔叽游戏

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 286|回复: 0

[python] python 如何快速复制序列

[复制链接]
  • TA的每日心情
    无聊
    2019-4-21 13:02
  • 签到天数: 3 天

    [LV.2]圆转纯熟

    发表于 2020-10-4 12:24:27 | 显示全部楼层 |阅读模式
    1 基本用法
    把序列乘以一个整数,就会产生一个新序列。这个新序列是原始序列复制了整数份,然后再拼接起来的结果。
    1. l=[1,2,3]
    2. l2=l * 3
    3. logging.info('l2 -> %s',l2)
    4. l3=5 * 'deniro'
    5. 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.jpg

    (1)错误示例 1
    1. weird_board = [['_'] * 3] * 3
    2. logging.info('weird_board -> %s', weird_board)
    3. weird_board[1][2] = 'X'
    4. logging.info('weird_board -> %s', weird_board)
    复制代码
    运行结果:
    INFO - weird_board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
    INFO - weird_board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]
    可以看到虽然代码中只修改了 [1][2] 位置的值,但却影响到了三处地方。这就说明这三处其实指向的是同一个引用。
    (2)错误示例 2
    这个示例犯的错与前一个示例相同,都是把同一个对象追加到同一块游戏板中(board)。
    1. row = ['_'] * 3
    2. board = []
    3. for i in range(3):
    4.   board.append(row)
    5. logging.info('board -> %s', board)
    6. board[1][2] = 'X'
    7. logging.info('board -> %s', board)
    复制代码
    运行结果:
    INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
    INFO - board -> [['_', '_', 'X'], ['_', '_', 'X'], ['_', '_', 'X']]
    (3)正确示例
    对示例 2 进行改造,就可以避免上述问题。
    1. board = []
    2. for i in range(3):
    3.   row = ['_'] * 3
    4.   board.append(row)
    5. logging.info('board -> %s', board)
    6. board[1][2] = 'X'
    7. logging.info('board -> %s', board)
    复制代码
    运行结果:
    INFO - board -> [['_', '_', '_'], ['_', '_', '_'], ['_', '_', '_']]
    INFO - board -> [['_', '_', '_'], ['_', '_', 'X'], ['_', '_', '_']]
    这里把 row = ['_'] * 3 放入 for 循环中,这样每一次循环都会新建一个 row,然后再放入游戏板中。这样游戏板中的每一个单元格都是独立的,互不影响。
    利用列表推导方法,还可以简化示例代码:
    1. board = [['_'] * 3 for i in range(3)]
    2. logging.info('board -> %s', board)
    3. board[1][2] = 'X'
    4. logging.info('board -> %s', board)
    复制代码
    以上就是python 如何快速复制序列的详细内容,更多关于python 复制序列的资料请关注咔叽论坛其它相关文章!

    原文地址:https://www.jb51.net/article/195049.htm

    QQ|免责声明|小黑屋|手机版|Archiver|咔叽游戏

    GMT+8, 2024-3-29 06:10

    Powered by Discuz! X3.4

    © 2001-2023 Discuz! Team.

    快速回复 返回顶部 返回列表