python大佬看过来,求助一个dict操作问题
本帖最后由 as614001 于 2021-5-21 16:57 编辑data={
"1552901014": [{
"colorId": "1552901014",
}, {
"colorId": "1552901014",
}]
}
print(data)
data['0000000000']=data.get('1552901014')
print(data)
for t in data['0000000000']:
t['colorId']='0000000000'
print(data)
输出
{'1552901014': [{'colorId': '1552901014'}, {'colorId': '1552901014'}]}
{'1552901014': [{'colorId': '1552901014'}, {'colorId': '1552901014'}], '0000000000': [{'colorId': '1552901014'}, {'colorId': '1552901014'}]}
{'1552901014': [{'colorId': '0000000000'}, {'colorId': '0000000000'}], '0000000000': [{'colorId': '0000000000'}, {'colorId': '0000000000'}]}
原因也大概明白,就是赋值问题,导致了原键值也被修改了,这个情况现象叫什么来着?
答案:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
[*]
直接赋值:其实就是对象的引用(别名)。
[*]
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。
[*]
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
这不下存在什么浅拷贝,深拷贝。就是正常的赋值。 data['0000000000']=data.get('1552901014') #这个直接向dict中添加一个Key为0000000,value是155xx的value,所以对应的value就和15xx的一样了。
for t in data['0000000000']:#这个是对000的value进行遍历,并赋值,value是一个list,list中的每个元素是一个dict,重新赋值,没有任何问题
浅见。
字典 `data` 的键 `0000000000` 通过赋值传递内存地址,指向了自身的键 `1552901014`。
因此两个键都是指向同一个内存地址,后续操作都是操作同一个对象实例。
如果要实现两个值各自独立,可以使用浅拷贝 `copy.copy`(如果列表里的值不需要复制的话,这将仅复制第一层的数据)或深拷贝 `copy.deepcopy`(递归列表内所有容器类型数据,完全复制出一个内容相同的列表)。
> 我写过的旧博客的遗留旧笔记,想真正理解可以看看:(https://blog.csdn.net/zsq8187/article/details/109907066) ytfrdfiw 发表于 2021-5-21 19:25
data['0000000000']=data.get('1552901014') #这个直接向dict中添加一个Key为0000000,value是155xx的val ...
你的想法可能不对。
Python 的字典对象是引用类型,不是值类型。字典里的键值对也一样是引用类型。
引用类型除了开辟新内存时有赋值操作,其他都是引用操作。
引用操作用的就是一块内存,改一处,就都改了。
拿楼主的例子来说:
```python
id(data.get('1552901014'))
# 内存地址为4533168512
data['0000000000']=data.get('1552901014')
id(data['0000000000'])
# 内存地址也是 4533168512
```
可依此查看`data['0000000000']`的元素和`data.get('1552901014')`中对应的元素是不是引用的一个内存地址。 thepoy 发表于 2021-5-21 22:50
你的想法可能不对。
Python 的字典对象是引用类型,不是值类型。字典里的键值对也一样是引用类型。
引 ...
感谢分享与指导。 data={"1552901014": [{"colorId": "1552901014"},{"colorId": "1552901014"}]}
print(data)
data['0000000000']=data.get('1552901014') #添加一个新的key,但value是一个引用,地址和155xx对应value一致
print(data)
for t in data['0000000000']: #因为是同一个地址,在这修改了,另一处也就修改了(即155xx对应的value也修改了)
t['colorId']='0000000000'
print(data)
页:
[1]