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中使用字典时遇到的问题,希望能进一步了解
问题点在哪儿?
我无法理解你的问题
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 的成员的值变了。
字典值存的是指向对象的指针
mutable & immutable objects
https://i.loli.net/2019/05/15/5cdbd8af49d1799870.png
你改成
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++还有值语义的

