使用自定义类的对象 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
![]() | 1 linnchord 2019-05-15 13:45:22 +08:00 问题点在哪儿? |
![]() | 2 viperasi 2019-05-15 14:06:42 +08:00 dic 里的 a 是内存引用而不是值引用? |
3 wonderay 2019-05-15 14:08:19 +08:00 因为 dic['cls'] is a, 输出:True |
5 hellwys1 2019-05-15 16:41:02 +08:00 把我看楞了,啥意思? 这不是对的吗? 还是觉得 key2 不该变? 这不是 value 的问题, 和 print(a.key1) print(a.key2) 没区别 |
6 lalalla 2019-05-15 16:43:26 +08:00 就是 cls 指向的对象本身变了啊.. |
7 junjieyuanxiling 2019-05-15 16:45:16 +08:00 via Android 这有什么不对的吗? 还有,建议你看看提问的智慧。 |
![]() | 8 ipwx 2019-05-15 16:52:29 +08:00 |
![]() | 9 ipwx 2019-05-15 16:54:14 +08:00 楼主的疑问,唯一的回答就是,python 所有标志符都是引用,用 c++ 的话来说就是所有标志符都是指针。 |
![]() | 10 moxiaowei 2019-05-15 16:57:37 +08:00 python 基础 可变参数 /不可变参数 |
![]() | 11 jesnridy 2019-05-15 16:58:20 +08:00 ![]() 面试题:说说 Python 中可变对象和不可变对象 |
![]() | 13 wrq 2019-05-15 17:06:30 +08:00 字典值存的是指向对象的指针 |
![]() | 14 inhzus 2019-05-15 17:16:09 +08:00 via Android ![]() mutable & immutable objects https://i.loli.net/2019/05/15/5cdbd8af49d1799870.png |
15 SeaRecluse 2019-05-15 17:23:52 +08:00 你改成 a = A() b = a dic = {"cls":b} 然后你就可以发现 python 的真相了 |
![]() | 16 NullPoint OP @jesnridy 明白了,字典 value 存的是可变参数,属性被改变了,id 并没有变 同理 ```python b = [] dic = {'lit':b} print(dic['lit']) b.append(1) print(dic['lit']) ``` 结果为 ```python [] [1] ``` |
17 pp3182429 2019-05-15 17:42:53 +08:00 ![]() |
![]() | 18 Takamine 2019-05-15 18:06:15 +08:00 via Android 深拷贝浅拷贝瞎拷贝:doge:。 |
![]() | 19 est 2019-05-15 18:17:35 +08:00 所有的语言应该都是这样处理的吧。 |
20 ty89 2019-05-15 18:55:07 +08:00 是你电脑坏了,换一个吧 |
21 exonuclease 2019-05-17 02:26:28 +08:00 via iPhone 你又不是 c++还有值语义的 |