吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1404|回复: 6
收起左侧

[已解决] python大佬看过来,求助一个dict操作问题

[复制链接]
as614001 发表于 2021-5-21 16:49
本帖最后由 as614001 于 2021-5-21 16:57 编辑

[Python] 纯文本查看 复制代码
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 方法,完全拷贝了父对象及其子对象。

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ytfrdfiw 发表于 2021-5-21 19:23
这不下存在什么浅拷贝,深拷贝。就是正常的赋值。
ytfrdfiw 发表于 2021-5-21 19:25
data['0000000000']=data.get('1552901014')   #这个直接向dict中添加一个Key为0000000,value是155xx的value,所以对应的value就和15xx的一样了。
for t in data['0000000000']:  #这个是对000的value进行遍历,并赋值,value是一个list,list中的每个元素是一个dict,重新赋值,没有任何问题
浅见。
Ercilan 发表于 2021-5-21 22:41

字典 data 的键 0000000000 通过赋值传递内存地址,指向了自身的键 1552901014
因此两个键都是指向同一个内存地址,后续操作都是操作同一个对象实例。
如果要实现两个值各自独立,可以使用浅拷贝 copy.copy(如果列表里的值不需要复制的话,这将仅复制第一层的数据)或深拷贝 copy.deepcopy(递归列表内所有容器类型数据,完全复制出一个内容相同的列表)。

我写过的旧博客的遗留旧笔记,想真正理解可以看看:Python 直接赋值、深拷贝、浅拷贝的详解_二次蓝的博客

免费评分

参与人数 1热心值 +1 收起 理由
as614001 + 1 我很赞同!

查看全部评分

thepoy 发表于 2021-5-21 22:50
ytfrdfiw 发表于 2021-5-21 19:25
data['0000000000']=data.get('1552901014')   #这个直接向dict中添加一个Key为0000000,value是155xx的val ...

你的想法可能不对。
Python 的字典对象是引用类型,不是值类型。字典里的键值对也一样是引用类型。
引用类型除了开辟新内存时有赋值操作,其他都是引用操作。
引用操作用的就是一块内存,改一处,就都改了。
拿楼主的例子来说:
id(data.get('1552901014'))
# 内存地址为  4533168512
data['0000000000']=data.get('1552901014')
id(data['0000000000'])
# 内存地址也是 4533168512

可依此查看data['0000000000']的元素和data.get('1552901014')中对应的元素是不是引用的一个内存地址。

免费评分

参与人数 1吾爱币 +1 收起 理由
as614001 + 1 我很赞同!

查看全部评分

ytfrdfiw 发表于 2021-5-26 19:55
thepoy 发表于 2021-5-21 22:50
你的想法可能不对。
Python 的字典对象是引用类型,不是值类型。字典里的键值对也一样是引用类型。
引 ...

感谢分享与指导。
ytfrdfiw 发表于 2021-5-26 20:01
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)
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 02:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表