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
chaleaoch
V2EX  ›  Python

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

  •  
  •   chaleaoch · 2017-05-04 10:53:55 +08:00 · 2318 次点击
    这是一个创建于 2790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    root = []
    root[:] = [root, root, None]
    root
    >>> [[...], [...], None]
    root = []
    root = [root, root, None]
    root
    >>> [[], [], None]

    哪位 juju 可以深入浅出的解释一下,多谢多谢。
    第 1 条附言  ·  2017-05-04 13:04:19 +08:00
    我明白了 ,谢谢大家的解答。
    6 条回复    2017-05-04 18:39:32 +08:00
    XYxe
        1
    XYxe  
       2017-05-04 11:06:50 +08:00 via Android   ❤️ 1
    第一种情况的两个 root 是同一个 list 的引用。
    第二种情况是创建了一个新的 list,元素是[root, root, None],这时候的 root 是[],然后把 root 指向这个对象,但是新 list 的前两个元素还是指向原来的那个[]。
    lilydjwg
        2
    lilydjwg  
       2017-05-04 11:10:51 +08:00
    buckyRRRR
        3
    buckyRRRR  
       2017-05-04 12:04:19 +08:00
    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  
       2017-05-04 12:58:17 +08:00
    几种写法的比较:
    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  
       2017-05-04 17:56:07 +08:00
    @thekoc
    b = [1,2]
    id(b)
    # Out[59]: 4459173000
    b[0:2] = [b,b,None]
    id(b)
    # Out[61]: 4459173000

    引用对象没变吧
    thekoc
        6
    thekoc  
       2017-05-04 18:39:32 +08:00
    @ziyo12580 #5

    笔误,应该是 124,root 引用的还是同一个对象,但是对象里面的内容变了。3 则是 root 本身引用的对象变为了另一个对象。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3403 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:21 · PVG 19:21 · LAX 03:21 · JFK 06:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.