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

2019 年 5 月 15 日
 NullPoint

使用自定义类的对象 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
3787 次点击
所在节点    Python
21 条回复
linnchord
2019 年 5 月 15 日
问题点在哪儿?
viperasi
2019 年 5 月 15 日
dic 里的 a 是内存引用而不是值引用?
wonderay
2019 年 5 月 15 日
因为 dic['cls'] is a, 输出:True
NullPoint
2019 年 5 月 15 日
@linnchord 就是字典的 value 被改变了
hellwys1
2019 年 5 月 15 日
把我看楞了,啥意思? 这不是对的吗?
还是觉得 key2 不该变?
这不是 value 的问题,

print(a.key1)
print(a.key2)
没区别
lalalla
2019 年 5 月 15 日
就是 cls 指向的对象本身变了啊..
junjieyuanxiling
2019 年 5 月 15 日
这有什么不对的吗?
还有,建议你看看提问的智慧。
ipwx
2019 年 5 月 15 日
@lalalla 不好意思没变。

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

然后你就可以发现 python 的真相了
NullPoint
2019 年 5 月 15 日
@jesnridy
明白了,字典 value 存的是可变参数,属性被改变了,id 并没有变
同理
```python
b = []
dic = {'lit':b}
print(dic['lit'])
b.append(1)
print(dic['lit'])
```
结果为
```python
[]
[1]
```
pp3182429
2019 年 5 月 15 日
Takamine
2019 年 5 月 15 日
深拷贝浅拷贝瞎拷贝:doge:。
est
2019 年 5 月 15 日
所有的语言应该都是这样处理的吧。
ty89
2019 年 5 月 15 日
是你电脑坏了,换一个吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://study.congcong.us/t/564336

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX