V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
heyjei
V2EX  ›  问与答

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

  •  
  •   heyjei · 2021-05-22 22:05:34 +08:00 · 718 次点击
    这是一个创建于 1311 天前的主题,其中的信息可能已经有所发展或是发生改变。

    如下面的代码,为啥 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]]
    
    第 1 条附言  ·  2021-05-23 14:36:37 +08:00
    4 条回复    2021-05-23 00:53:03 +08:00
    ysc3839
        1
    ysc3839  
       2021-05-22 23:13:17 +08:00 via Android   ❤️ 1
    个人猜测 [x] * 3 只是把 x 引用 3 次,不会深拷贝。所以你改了 x 就全变了。
    heyjei
        2
    heyjei  
    OP
       2021-05-22 23:17:10 +08:00
    @ysc3839 还真是这么回事,这个问题困扰了我一晚上了
    IgniteWhite
        3
    IgniteWhite  
       2021-05-23 00:24:22 +08:00
    很生动的例子。Python 节点最近问了很多类似的可变对象 /不可变对象,深浅拷贝,或者 Python 里指针概念的问题,可以去参考一下。
    0ZXYDDu796nVCFxq
        4
    0ZXYDDu796nVCFxq  
       2021-05-23 00:53:03 +08:00
    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])
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1081 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 19:12 · PVG 03:12 · LAX 11:12 · JFK 14:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.