推荐学习书目
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
chaleaoch
V2EX  ›  Python

关于 Python 列表的值赋值,和地址赋值的一个问题

  •  
  •   chaleaoch · May 4, 2017 · 2997 views
    This topic created in 3310 days ago, the information mentioned may be changed or developed.
    root = []
    root[:] = [root, root, None]
    root
    >>> [[...], [...], None]
    root = []
    root = [root, root, None]
    root
    >>> [[], [], None]

    哪位 juju 可以深入浅出的解释一下,多谢多谢。
    Supplement 1  ·  May 4, 2017
    我明白了 ,谢谢大家的解答。
    6 replies    2017-05-04 18:39:32 +08:00
    XYxe
        1
    XYxe  
       May 4, 2017 via Android   ❤️ 1
    第一种情况的两个 root 是同一个 list 的引用。
    第二种情况是创建了一个新的 list,元素是[root, root, None],这时候的 root 是[],然后把 root 指向这个对象,但是新 list 的前两个元素还是指向原来的那个[]。
    lilydjwg
        2
    lilydjwg  
       May 4, 2017
    buckyRRRR
        3
    buckyRRRR  
       May 4, 2017
    root =[]
    创建一个空列表对象,假设地址是 11111,root 变量存这个地址


    root[:] = [root, root, None]
    1.先执行[root, root, None] ,创建一个含三个元素的列表对象,地址假设为,22222,其中前两个 root 变量存的是 11111 这个地址,
    2.执行 root[:],复制一个空列表对象,把这个新对象地址存在 root 变量里,因为是复制出来的是新对象,所以 root 里存的地址从 11111 变成 33333 (假设)
    3.进行赋值 root 存的地址存 33333 变成 22222,也就是指向[root, root, None] ,而此时[root, root, None] 里面的 root 又指向[root, root, None] ,然后会无限循环下去
    thekoc
        4
    thekoc  
       May 4, 2017
    几种写法的比较:
    root = [1, 2]
    root[:] = [root, root, None]

    root = [1, 2]
    root[0:2] = [root, root, None]

    root = [1, 2]
    root = [root, root, None]

    root = [1, 2]
    root[0] = [root, root, None]

    1、3、4 都是一样的,root 引用的还是同一个对象,但是对象里面的内容变了。2 则是 root 本身引用的对象变为了另一个对象。
    ziyo12580
        5
    ziyo12580  
       May 4, 2017
    @thekoc
    b = [1,2]
    id(b)
    # Out[59]: 4459173000
    b[0:2] = [b,b,None]
    id(b)
    # Out[61]: 4459173000

    引用对象没变吧
    thekoc
        6
    thekoc  
       May 4, 2017
    @ziyo12580 #5

    笔误,应该是 124,root 引用的还是同一个对象,但是对象里面的内容变了。3 则是 root 本身引用的对象变为了另一个对象。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   5338 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 77ms · UTC 07:40 · PVG 15:40 · LAX 00:40 · JFK 03:40
    ♥ Do have faith in what you're doing.