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

python 代码疑问

  •  
  •   Chyroc · 2016-09-18 16:13:13 +08:00 · 2795 次点击
    这是一个创建于 3013 天前的主题,其中的信息可能已经有所发展或是发生改变。

    为什么输出是[{'key': 'b'}, {'key': 'b'}, {'key': 'b'}, {'key': 'b'}]

    a 去哪了

    17 条回复    2016-09-19 10:05:05 +08:00
    zhuangzhuang1988
        1
    zhuangzhuang1988  
       2016-09-18 16:24:53 +08:00   ❤️ 1
    stargazer
        2
    stargazer  
       2016-09-18 16:26:39 +08:00
    if True 。。。。。
    stargazer
        3
    stargazer  
       2016-09-18 16:31:34 +08:00
    啊,少看一行....append 的是地址引用的 item ,所以你 item 修改了 key 的值, items 里的值也就被修改了,如果你 append 的是 deepcopy 的就是另外一个样,你可以试试没有 for 循环的,另外 for 循环每进行一次, item 都是一个新的对象,以上
    jy02201949
        4
    jy02201949  
       2016-09-18 16:31:43 +08:00
    if True 然后来问 a 去哪了
    kimchan
        5
    kimchan  
       2016-09-18 16:33:22 +08:00
    你 append 的第一个 item 是字典的地址, 而不是字典的值...所以你后面改了字典的值, 自然变成 b 了..
    xubingok
        6
    xubingok  
       2016-09-18 17:31:17 +08:00
    @zhuangzhuang1988
    这个网站真是屌爆了...
    kittygirl0070
        7
    kittygirl0070  
       2016-09-18 17:36:58 +08:00
    item['key']=a 和 item['key']=b 这两句当中的 item 是同一个对象(object),你的代码相当于把同一个字典 append 2 次到一个 list ,在一个 for 循环中,第一步 item['key']=a ,第二步把 item 加入 list, 第三步 item['key']=b(因为 if True 相当于不存在,你把这句去掉再看会容易理解),第四步把 item 加入 list. 你的循环体执行2次,所以你的 list 里面实际上是两个不同的字典,第一个和第二个是同一个,第三个和第四个是同一个,尽管这两个字典的内容是相同的,它们的 id 是不一样的.你执行完了自己的代码再试一下:
    for item in items:
    print(id(item))
    你就明白了.
    dishonest
        8
    dishonest  
       2016-09-18 18:16:20 +08:00
    对 item 的两次操作都作用在同一个 dict 对象
    aiver
        9
    aiver  
       2016-09-18 18:31:54 +08:00
    python 里面“一切皆对象”, items 里面存储的只是 item 地址而不是值,即“存引用而不存值”,当你改变了 item 里面的值后, items 里面的值当然也跟着变化啦
    zhoulouzi
        10
    zhoulouzi  
       2016-09-18 22:17:09 +08:00
    dict key 。
    leavic
        11
    leavic  
       2016-09-18 22:48:12 +08:00 via iPhone
    if 'True 是什么鬼?
    Chyroc
        12
    Chyroc  
    OP
       2016-09-18 22:58:06 +08:00
    @stargazer
    @jy02201949
    @leavic
    实际判断的是别的,此处用 if True 说明
    Chyroc
        13
    Chyroc  
    OP
       2016-09-18 22:58:49 +08:00
    eloah
        14
    eloah  
       2016-09-18 22:59:41 +08:00
    7 楼正解

    体会一下,
    list = []
    a = 0
    list.append(a)
    list.append(a)
    print(list)
    a = 1
    print(list)

    对于每一次 for 循环来说,都存在一些局部的变量,就类似于你的那个 i,只存活在循环体中,所以两次循环你的 item 是不一样的
    WangYanjie
        15
    WangYanjie  
       2016-09-18 23:18:48 +08:00
    Python 用类似指针的概念来指向字典,你的 item 其实只是保存了一个指针,而你之后修改了这个指针指的内存块:

    ‘’‘
    >>> a = {'k': 'x'}
    >>> c = [a]
    >>> c
    [{'k': 'x'}]
    >>> a
    {'k': 'x'}
    >>> a['k'] = 'y'
    >>> c
    [{'k': 'y'}]
    >>> a
    {'k': 'y'}
    ’‘’‘
    Allianzcortex
        16
    Allianzcortex  
       2016-09-19 09:44:23 +08:00
    之前在 V 站就回答过这类问题⊙﹏⊙b 汗,还是 mutable 和 immutable 的问题。 Python 是 reference by object 的语言,你试试 copy.copy(item) 后再改变 item 的值。
    CallMeZ
        17
    CallMeZ  
       2016-09-19 10:05:05 +08:00
    @zhuangzhuang1988 强,哈哈
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2839 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 14:51 · PVG 22:51 · LAX 06:51 · JFK 09:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.