zoukankan      html  css  js  c++  java
  • Python创建二维数组(关于list的一个小坑)

    1.遇到的问题

    今天写Python代码的时候遇到了一个大坑,差点就耽误我交作业了。。。
    问题是这样的,我需要创建一个二维数组,如下:

    m = n = 3
    test = [[0] * m] * n
    print("test =", test)
    

    输出结果如下:

    test = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    

    是不是看起来没有一点问题?
    一开始我也是这么觉得的,以为是我其他地方用错了什么函数,结果这么一试:

    #Python学习交流群:778463939
    m = n = 3
    test = [[0] * m] * n
    print("test =", test)
    
    test[0][0] = 233
    print("test =", test)
    

    输出结果如下:

    test = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    test = [[233, 0, 0], [233, 0, 0], [233, 0, 0]]
    

    是不是很惊讶?!
    这个问题真的是折磨我一个中午,去网上一搜,官方文档中给出的说明是这样的:

    Note also that the copies are shallow; nested structures are not copied. This often haunts new Python programmers; consider:

    >>> lists = [[]] * 3
    >>> lists
    [[], [], []]
    >>> lists[0].append(3)
    >>> lists
    [[3], [3], [3]]
    

    What has happened is that [[]] is a one-element list containing an empty list, so all three elements of [[]] * 3 are (pointers to) this single empty list. Modifying any of the elements of lists modifies this single list. You can create a list of different lists this way:

    >>>
    >>> lists = [[] for i in range(3)]
    >>> lists[0].append(3)
    >>> lists[1].append(5)
    >>> lists[2].append(7)
    >>> lists
    [[3], [5], [7]]
    

    也就是说matrix = [array] * 3操作中,只是创建3个指向array的引用,所以一旦array改变,matrix中3个list也会随之改变。

    2.创建二维数组的办法

    2.1 直接创建法

    test = [0, 0, 0], [0, 0, 0], [0, 0, 0]]
    

    简单粗暴,不过太麻烦,一般不用。

    2.2 列表生成式法

    test = [[0 for i in range(m)] for j in range(n)]
    

    学会使用列表生成式,终生受益。

    2.3 使用模块numpy创建

    import numpy as np
    test = np.zeros((m, n), dtype=np.int)
    
  • 相关阅读:
    积性函数大全(欧拉函数、莫比乌斯反演、杜教筛……)
    Codeforces 1427 G.One Billion Shades of Grey
    Codeforces Global Round 11 A-F题解
    一般难度模板复习
    (补充)证明线性递推相关的Hamilton-Cayley定理
    [ZJOI2018]树
    [ICPC-Beijing 2006]狼抓兔子
    P4869 albus就是要第一个出场
    浅谈算法——线性基
    [COCI2017-2018#1] Deda
  • 原文地址:https://www.cnblogs.com/xxpythonxx/p/14486977.html
Copyright © 2011-2022 走看看