V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
heyjei
V2EX  ›  问与答

一个 Python 的二维列表的赋值问题

  •  
  •   heyjei · May 22, 2021 · 1002 views
    This topic created in 1802 days ago, the information mentioned may be changed or developed.

    如下面的代码,为啥 a 和 b 最后的值会不一样?

    >>> a = [[0,0,0]] * 3
    
    >>> a
    
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    >>> a[1][1] = 1
    
    >>> a
    
    [[0, 1, 0], [0, 1, 0], [0, 1, 0]]
    >>> b = [[0,0,0], [0,0,0], [0,0,0]]
    
    >>> b
    
    [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
    >>> b[1][1] = 1
    
    >>> b
    
    [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
    
    Supplement 1  ·  May 23, 2021
    4 replies    2021-05-23 00:53:03 +08:00
    ysc3839
        1
    ysc3839  
       May 22, 2021 via Android   ❤️ 1
    个人猜测 [x] * 3 只是把 x 引用 3 次,不会深拷贝。所以你改了 x 就全变了。
    heyjei
        2
    heyjei  
    OP
       May 22, 2021
    @ysc3839 还真是这么回事,这个问题困扰了我一晚上了
    FurN1
        3
    FurN1  
       May 23, 2021
    很生动的例子。Python 节点最近问了很多类似的可变对象 /不可变对象,深浅拷贝,或者 Python 里指针概念的问题,可以去参考一下。
    0ZXYDDu796nVCFxq
        4
    0ZXYDDu796nVCFxq  
       May 23, 2021
    a = [[0,0,0]] * 3
    id(a[0])
    id(a[1])
    id(a[2])

    b = [[0,0,0], [0,0,0], [0,0,0]]
    id(b[0])
    id(b[1])
    id(b[2])
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5505 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 44ms · UTC 08:46 · PVG 16:46 · LAX 01:46 · JFK 04:46
    ♥ Do have faith in what you're doing.