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

使用自定义类的对象 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

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

22 回复

问题点在哪儿?


我无法理解你的问题

dic 里的 a 是内存引用而不是值引用?

因为 dic[‘cls’] is a, 输出:True

就是字典的 value 被改变了

把我看楞了,啥意思? 这不是对的吗?
还是觉得 key2 不该变?
这不是 value 的问题,

print(a.key1)
print(a.key2)
没区别

就是 cls 指向的对象本身变了啊…

这有什么不对的吗?
还有,建议你看看提问的智慧。

不好意思没变。

a.key1 会产生一个新的 instance property,并不会改变 cls 的 key1.

楼主的疑问,唯一的回答就是,python 所有标志符都是引用,用 c++ 的话来说就是所有标志符都是指针。

python 基础 可变参数 /不可变参数

面试题:说说 Python 中可变对象和不可变对象

我指的是 dic 这个字典中 “cls” 这个 key 指向的对象 a 的成员的值变了。

字典值存的是指向对象的指针

你改成
a = A()
b = a
dic = {“cls”:b}

然后你就可以发现 python 的真相了


明白了,字典 value 存的是可变参数,属性被改变了,id 并没有变
同理
python<br>b = []<br>dic = {'lit':b}<br>print(dic['lit'])<br>b.append(1)<br>print(dic['lit'])<br>
结果为
python<br>[]<br>[1]<br>

深拷贝浅拷贝瞎拷贝:doge:。

所有的语言应该都是这样处理的吧。

是你电脑坏了,换一个吧

你又不是 c++还有值语义的

回到顶部