深浅cope
这里应该先介绍变量赋值机制
浅copy
现有数据
data = {
"name":"alex",
"age":18,
"scores":{
"语文":130,
"数学":60,
"英语":98,
}
}
d2 = data
data["age"] = 20
print(d2)
你说d2打印的值里,age是18,还是20?
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
看一下id
>>> print('赋值',id(data),id(d2))
赋值 4439292336 4439292336
为何是20呢? 因为d2=data相当于只是拿到了data的内存地址,但data里的每个k,v都是有单独的内存的地址的。
d2,data会一直共享这个dict里的数据,不会出现像之前字符串a=1,b=a, a=2, b依然等于1的情况。
如果我确实想复制一份完成的dict数据怎么办呢?
可以用浅copy语法
data = {
"name":"alex",
"age":18,
"scores":{
"语文":130,
"数学":60,
"英语":98,
}
}
d2 = data.copy()
data["age"] = 20
print(d2)
print(data)
输出
{'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
id
>>> print('浅copy',id(data),id(d2))
浅copy 4440084720 4440087120
可以看到id是一样的,这样就相当于是2份独立数据了, 但是为什么这个语法叫做浅copy呢? 你改一下score里的值 就知道了。
data = {
"name":"alex",
"age":18,
"scores":{
"语文":130,
"数学":60,
"英语":98,
}
}
d2 = data.copy()
data["age"] = 20
data["scores"]["数学"] = 77
print(d2)
print(data)
看输出 , 很神奇,两个Dict里age的值是独立的,但score字典里的分数值貌似是共享的
{'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
id
>>> print(id(data["scores"]),id(d2["scores"])) #第二层数据
4440080288 4440080288
因为浅copy会仅复制dict的第一层数据,更深层的scores下面的值依然是共享一份。
深copy
若你想彻底使上面的2个dict完全独立,无论有多少层数据。那就要用python工具包里的一个工具了,
>>> import copy
>>> d2 = copy.deepcopy(data)
>>> print('深copy',id(data),id(d2))
深copy 4439292336 4440080288
>>> data["age"] = 20
>>> data["scores"]["数学"] = 77
>>> print(d2)
{'name': 'alex', 'age': 18, 'scores': {'语文': 130, '数学': 60, '英语': 98}}
>>> print(data)
{'name': 'alex', 'age': 20, 'scores': {'语文': 130, '数学': 77, '英语': 98}}
>>> print(id(data["age"]),id(d2["age"])) #第一层数据
4434787728 4434787664
>>> print(id(data["scores"]),id(d2["scores"])) #第二层数据
4440087120 4440896528
原文地址:https://www.cnblogs.com/sunny666/p/11516679.html
- 如果在BackgroundWorker运行过程中关闭窗体…
- 从数据到代码——基于T4的代码生成方式
- 解决T4模板的程序集引用的五种方案
- 编写T4模板进行代码生成无法避免的两个话题:"Assembly Locking"&"Debug"
- 从yield关键字看IEnumerable和Collection的区别
- 让“链式调用(方法链)”更加自然一点
- ASP.NET应用下基于SessionState的“状态编程框架”解决方案
- 为自定义配置的编辑提供”智能感知”的支持
- 在ASP.NET Core应用中如何设置和获取与执行环境相关的信息?
- 在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
- [ASP.NET MVC]如何定制Numeric属性/字段验证消息
- 为.NET Core项目定义Item Template
- 晚绑定场景下对象属性赋值和取值可以不需要PropertyInfo
- 一个关于反序列化的小问题
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- (八)golang--复杂类型之指针
- 关于HttpPost 请求和PostMan请求访问出错
- Proxy与Reflect学习笔记
- 确定的有穷状态机(DFA) -- 你来看也能懂的C++代码示例
- python中的any和all函数
- 关于数据库中NOT NUll 的问题。
- 通俗点聊聊算法 -- 链表误成环
- (十)golang--运算符
- (十一)golang--键盘输入
- python中的__call__和__repr__魔术方法
- (十二)golang--进制和位运算
- Java实现操作系统实验之磁盘调度
- hashMap源码分析即hashTable和 hashMAp的区别
- 走进STL - 红黑树,是圣诞树吗
- BigDecimal大小判断