V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Yvette
V2EX  ›  Python

两层的列表好像有个 bug(要么就是我理解有误…)

  •  
  •   Yvette · 2017-02-26 15:19:41 +08:00 · 2008 次点击
    这是一个创建于 2862 天前的主题,其中的信息可能已经有所发展或是发生改变。

    生成一个矩阵(列表内列表,包括 [[]]),复制内容到另一个变量时,虽然 identity 不同,但是内容更改之后还是会联动

    >>> n = 2
    >>> M = [[0 for _ in range(n)] for _ in range(n)]
    >>> m = list(M)
    >>> m
    [[0, 0], [0, 0]]
    >>> M
    [[0, 0], [0, 0]]
    >>> m[0][0] = 1
    >>> m
    [[1, 0], [0, 0]]
    >>> M
    [[1, 0], [0, 0]]
    >>>
    >>> id(m)-id(M)
    1152
    

    m = list(M) 换成 m = M[:] 或者 m = M.copy() 也没用

    不用列表解析式手打也是一样

    >>> M=[[1,2],[]]
    >>> m = M.copy()
    >>> m
    [[1, 2], []]
    >>> M
    [[1, 2], []]
    >>> m[0][0] = 3
    >>> m
    [[3, 2], []]
    >>> M
    [[3, 2], []]
    >>> 
    >>> id(m)-id(M)
    960
    

    算法作业查了半个小时才查到这有问题……

    第 1 条附言  ·  2017-02-26 17:40:53 +08:00
    还是论坛有效率😂每个回帖都有帮助,太感谢了
    8 条回复    2017-02-27 11:48:19 +08:00
    trnhoe
        1
    trnhoe  
       2017-02-26 15:34:34 +08:00 via Android   ❤️ 1
    你需要 m=copy.deepcopy(M)
    xiahei
        2
    xiahei  
       2017-02-26 15:35:15 +08:00   ❤️ 1
    ```python
    In [1]: from copy import deepcopy

    In [2]: m = [[1, 2], []]

    In [3]: M = deepcopy(m)

    In [4]: M
    Out[4]: [[1, 2], []]

    In [5]: m
    Out[5]: [[1, 2], []]

    In [6]: m[0][0] = 2

    In [7]: m
    Out[7]: [[2, 2], []]

    In [8]: M
    Out[8]: [[1, 2], []]

    In [9]: n = 2

    In [10]: M = [[0 for _ in range(n)] for _ in range(n)]

    In [11]: m = list(M)

    In [12]: id(m[0]) == id(M[0])
    Out[12]: True
    ```
    ligyxy
        3
    ligyxy  
       2017-02-26 15:36:38 +08:00 via Android   ❤️ 2
    kindjeff
        4
    kindjeff  
       2017-02-26 16:10:55 +08:00   ❤️ 1
    是你理解有问题……这样才是对的。
    argsno
        5
    argsno  
       2017-02-26 16:15:23 +08:00 via Android   ❤️ 1
    这样是浅复制,只会复制第一层 list 的元素
    Yinz
        6
    Yinz  
       2017-02-26 19:04:07 +08:00
    外层 list 的 identity 确实不同,但是内层几个对应位置的 list 的 identity 还是一样的 (
    Yvette
        8
    Yvette  
    OP
       2017-02-27 11:48:19 +08:00 via iPhone
    @cszhiyue 感谢,这个好,学习了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   933 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 22:40 · PVG 06:40 · LAX 14:40 · JFK 17:40
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.