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

2019-05-15 13:41:53 +08:00
 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
2673 次点击
所在节点    Python
21 条回复
linnchord
2019-05-15 13:45:22 +08:00
问题点在哪儿?
viperasi
2019-05-15 14:06:42 +08:00
dic 里的 a 是内存引用而不是值引用?
wonderay
2019-05-15 14:08:19 +08:00
因为 dic['cls'] is a, 输出:True
NullPoint
2019-05-15 16:33:32 +08:00
@linnchord 就是字典的 value 被改变了
hellwys1
2019-05-15 16:41:02 +08:00
把我看楞了,啥意思? 这不是对的吗?
还是觉得 key2 不该变?
这不是 value 的问题,

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

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

然后你就可以发现 python 的真相了
NullPoint
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
2019-05-15 17:42:53 +08:00
Takamine
2019-05-15 18:06:15 +08:00
深拷贝浅拷贝瞎拷贝:doge:。
est
2019-05-15 18:17:35 +08:00
所有的语言应该都是这样处理的吧。
ty89
2019-05-15 18:55:07 +08:00
是你电脑坏了,换一个吧

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

https://www.v2ex.com/t/564336

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

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

© 2021 V2EX