使用自定义类的对象 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 1
面试题:说说 Python 中可变对象和不可变对象
|
13
wrq 2019-05-15 17:06:30 +08:00
字典值存的是指向对象的指针
|
14
inhzus 2019-05-15 17:16:09 +08:00 via Android 1
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 1
|
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++还有值语义的
|