首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
宝塔
V2EX  ›  Python

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

  •  
  •   NullPoint · 186 天前 · 1617 次点击
    这是一个创建于 186 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用自定义类的对象 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
        1
    linnchord   186 天前
    问题点在哪儿?
        2
    viperasi   186 天前
    dic 里的 a 是内存引用而不是值引用?
        3
    wonderay   186 天前
    因为 dic['cls'] is a, 输出:True
        4
    NullPoint   186 天前
    @linnchord 就是字典的 value 被改变了
        5
    hellwys1   186 天前
    把我看楞了,啥意思? 这不是对的吗?
    还是觉得 key2 不该变?
    这不是 value 的问题,

    print(a.key1)
    print(a.key2)
    没区别
        6
    lalalla   186 天前
    就是 cls 指向的对象本身变了啊..
        7
    junjieyuanxiling   186 天前 via Android
    这有什么不对的吗?
    还有,建议你看看提问的智慧。
        8
    ipwx   186 天前
    @lalalla 不好意思没变。

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

    然后你就可以发现 python 的真相了
        16
    NullPoint   186 天前
    @jesnridy
    明白了,字典 value 存的是可变参数,属性被改变了,id 并没有变
    同理
    ```python
    b = []
    dic = {'lit':b}
    print(dic['lit'])
    b.append(1)
    print(dic['lit'])
    ```
    结果为
    ```python
    []
    [1]
    ```
        17
    pp3182429   186 天前   ♥ 1
        18
    Takamine   186 天前 via Android
    深拷贝浅拷贝瞎拷贝:doge:。
        19
    est   186 天前
    所有的语言应该都是这样处理的吧。
        20
    ty89   186 天前
    是你电脑坏了,换一个吧
        21
    exonuclease   185 天前 via iPhone
    你又不是 c++还有值语义的
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   781 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 25ms · UTC 22:15 · PVG 06:15 · LAX 14:15 · JFK 17:15
    ♥ Do have faith in what you're doing.