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

Python 使用字典时遇到的问题,希望能进一步了解

  •  
  •   NullPoint · 2019-05-15 13:41:53 +08:00 · 2868 次点击
    这是一个创建于 2011 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用自定义类的对象 a 作为字典的 value,改变 a 的属性,对应字典 value 同时改变 输入:

    class A:
        key1=1
        def __init__(self):
            self.key2=2
    a = A()
    dic = {'cls':a}
    print(dic['cls'].key1,dic['cls'].key2)
    a.key1,a.key2 = 3,4
    print(dic['cls'].key1,dic['cls'].key2)
    

    输出:

    1 2
    3 4
    
    21 条回复    2019-05-17 02:26:28 +08:00
    linnchord
        1
    linnchord  
       2019-05-15 13:45:22 +08:00
    问题点在哪儿?
    viperasi
        2
    viperasi  
       2019-05-15 14:06:42 +08:00
    dic 里的 a 是内存引用而不是值引用?
    wonderay
        3
    wonderay  
       2019-05-15 14:08:19 +08:00
    因为 dic['cls'] is a, 输出:True
    NullPoint
        4
    NullPoint  
    OP
       2019-05-15 16:33:32 +08:00
    @linnchord 就是字典的 value 被改变了
    hellwys1
        5
    hellwys1  
       2019-05-15 16:41:02 +08:00
    把我看楞了,啥意思? 这不是对的吗?
    还是觉得 key2 不该变?
    这不是 value 的问题,

    print(a.key1)
    print(a.key2)
    没区别
    lalalla
        6
    lalalla  
       2019-05-15 16:43:26 +08:00
    就是 cls 指向的对象本身变了啊..
    junjieyuanxiling
        7
    junjieyuanxiling  
       2019-05-15 16:45:16 +08:00 via Android
    这有什么不对的吗?
    还有,建议你看看提问的智慧。
    ipwx
        8
    ipwx  
       2019-05-15 16:52:29 +08:00
    @lalalla 不好意思没变。

    a.key1 会产生一个新的 instance property,并不会改变 cls 的 key1.
    ipwx
        9
    ipwx  
       2019-05-15 16:54:14 +08:00
    楼主的疑问,唯一的回答就是,python 所有标志符都是引用,用 c++ 的话来说就是所有标志符都是指针。
    moxiaowei
        10
    moxiaowei  
       2019-05-15 16:57:37 +08:00
    python 基础 可变参数 /不可变参数
    jesnridy
        11
    jesnridy  
       2019-05-15 16:58:20 +08:00   ❤️ 1
    面试题:说说 Python 中可变对象和不可变对象
    lalalla
        12
    lalalla  
       2019-05-15 17:05:02 +08:00
    @ipwx 我指的是 dic 这个字典中 "cls" 这个 key 指向的对象 a 的成员的值变了。
    wrq
        13
    wrq  
       2019-05-15 17:06:30 +08:00
    字典值存的是指向对象的指针
    inhzus
        14
    inhzus  
       2019-05-15 17:16:09 +08:00 via Android   ❤️ 1
    SeaRecluse
        15
    SeaRecluse  
       2019-05-15 17:23:52 +08:00
    你改成
    a = A()
    b = a
    dic = {"cls":b}

    然后你就可以发现 python 的真相了
    NullPoint
        16
    NullPoint  
    OP
       2019-05-15 17:31:07 +08:00
    @jesnridy
    明白了,字典 value 存的是可变参数,属性被改变了,id 并没有变
    同理
    ```python
    b = []
    dic = {'lit':b}
    print(dic['lit'])
    b.append(1)
    print(dic['lit'])
    ```
    结果为
    ```python
    []
    [1]
    ```
    pp3182429
        17
    pp3182429  
       2019-05-15 17:42:53 +08:00   ❤️ 1
    Takamine
        18
    Takamine  
       2019-05-15 18:06:15 +08:00 via Android
    深拷贝浅拷贝瞎拷贝:doge:。
    est
        19
    est  
       2019-05-15 18:17:35 +08:00
    所有的语言应该都是这样处理的吧。
    ty89
        20
    ty89  
       2019-05-15 18:55:07 +08:00
    是你电脑坏了,换一个吧
    exonuclease
        21
    exonuclease  
       2019-05-17 02:26:28 +08:00 via iPhone
    你又不是 c++还有值语义的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2483 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:03 · PVG 00:03 · LAX 08:03 · JFK 11:03
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.