python 可变、不可变类型、深拷贝、浅拷贝理解
简介
python中数据分为可变类型,不可变类型。不同的数据类型影响着不同情况下的深浅拷贝。
下面则将简要介绍一下
可变类型
当某个数据的值发生改变时,它对应的内存地址不发生改变,常见的有列表、字典、集合
为什么可变类型,值发生变化,内存地址不会发生变化呢?
可变类型中拥有一个内存地址,其中值存放的是各个元素的内存地址,所以当值发生改变时(例如append)时只会在值中新增内存地址,不会对列表原有的内存地址造成修改
不可变类型
不可变类型:当某个数据的值发生改变时,它对应的内存地址也发生改变,常见的有字符串、元组、数字、布尔
深拷贝
深拷贝都会复制可变类型对象和不可变类型对象
data = [1,2,3,"test", {1,2,3}, [1,2,3], {"name":"tom", "age":19}]
copy_data = copy.deepcopy(data)
print(copy_data)
data[4].add(4)
print("----------------")
print(data)
print(copy_data)
print("----------------")
data[5].append(4)
print(data)
print(copy_data)
print("----------------")
data[6]["gender"] = "man"
print(data)
print(copy_data)
[1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
[1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
[1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19, 'gender': 'man'}]
[1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
从上述结果来看,深拷贝后的数据与原数据是独立的,数据不会受到影响
浅拷贝
浅拷贝只会复制不可变类型对象,而可变类型对象复制的则是内存地址,当可变类型对象中的元素发生改变时,会影响到原有数据
data = [1,2,3,"test", {1,2,3}, [1,2,3], {"name":"tom", "age":19}]
copy_data = data.copy()
print(copy_data)
data[4].add(4)
print("----------------")
print(data)
print(copy_data)
print("----------------")
data[5].append(4)
print(data)
print(copy_data)
print("----------------")
data[6]["gender"] = "man"
print(data)
print(copy_data)
[1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
----------------
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19, 'gender': 'man'}]
[1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19, 'gender': 'man'}]
从上述结果看,所有的对于可变类型对象的操作都影响到了原数据
总结
当拷贝数据后,不想要影响到原有数据,建议使用深拷贝,在大多数场景下其实只是想要拷贝数据的值,并不想影响到原有数据,建议使用深拷贝。
python 可变、不可变类型、深拷贝、浅拷贝理解的更多相关文章
- Python中的可变对象与不可变对象、浅拷贝与深拷贝
Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...
- Python(可变/不可变类型,list,tuple,dict,set)
补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...
- 理解 Python 中的可变参数 *args 和 **kwargs:
默认参数: Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...
- 005 python 整数类型/字符串类型/列表类型/可变/不可变
可变/不可变类型 可变类型 ID不变的情况下,值改变,则称之为可变类型,如列表,字典 不可变类型 值改变,ID改变,则称之为不可变类型,如 整数 字符串,元组 整数类型 int 正整数 用途就是记录年 ...
- 【04】Python 深拷贝浅拷贝 函数 递归 集合
1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b 比较两个对象的内容是否相等(可以是不同内存空间) a is b 比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- python 中的可变对象与不可变对象
近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...
- Python 拓展之详解深拷贝和浅拷贝
正式开始 首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要 ...
- Python中的赋值、深拷贝与浅拷贝(内存地址)
Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...
- python中的可变与不可变对象
Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
随机推荐
- UNIAPP实现PDA扫码
目前我接触到了两种方法,以扫码pda安卓采集器(可以直接理解为手机上有个激光扫码)的设置划分. 1.扫描设置 --> 键盘方式输出(键盘类型:物理键盘),注意设置要看具体的型号: 2.扫码设置 ...
- 最新管家婆财贸ERP C9 V22.0的应用网页版的财务软件1000用户补丁免狗授权注册机网络版软件下载
管家婆财贸ERPC9应用价值: 1.多组织独立核算 多种组织形态核算,出具独立的三大财务报表及业务报表,发挥经营管理的积极性,便于专业化运营. 2.兼顾统筹与分权 满足多种集团统管与分权管控模式需求, ...
- Servlet表单数据
1.GET 方法 GET 方法向页面请求发送已编码的用户信息.页面和已编码的信息中间用 ? 字符分隔,如下所示: http://www.test.com/hello?key1=value1&k ...
- 20212115朱时鸿实验一《python程序设计》实验报告
------------恢复内容开始------------ #学号20212115 <python程序设计>实验一报告 课程: <python程序设计> 班级:2121 姓名 ...
- [BJOI2014]想法
参考 P4581传送门 题意:给DAG,问每个点可以由多少个叶子到达. 思路: 随机化!!(题面有提示) 这道题利用在一个范围内随机的数期望均分范围的性质. 直接每个叶子在\([0,Max\_Rand ...
- 测试平台系列(95) 前置条件支持简单的python脚本
大家好~我是米洛! 我正在从0到1打造一个开源的接口测试平台, 也在编写一套与之对应的教程,希望大家多多支持. 欢迎关注我的公众号米洛的测开日记,获取最新文章教程! 回顾 上一节我们构思了一下怎么去支 ...
- ClickHouse(01)什么是ClickHouse,ClickHouse适用于什么场景
ClickHouse的由来 ClickHouse是什么数据库?ClickHouse速度有多快?应用场景是怎么样的?ClickHouse是关系型数据库吗?ClickHouse目前是很火爆的一款面向OLA ...
- GO的日志库log竟然这么简单!
前言 最近在尝试阅读字节开源RPC框架Kitex的源码,看到日志库klog部分,果不其然在Go原生的log库的基础上增加了自己的设计,大体包括增加了一些格式化的输出.增加一些常用的日志级别等. 一番了 ...
- 给小白的 PG 容器化部署教程(下)
作者:王志斌 编辑:钟华龙 本文来自社区小伙伴 王志斌 的投稿.从小白的角度,带你一步步实现将 RadonDB PostgreSQL 集群部署到 Kubernetes 上.文章分为上下两部分,< ...
- ABP框架之——数据访问基础架构(下)
大家好,我是张飞洪,感谢您的阅读,我会不定期和你分享学习心得,希望我的文章能成为你成长路上的一块垫脚石,我们一起精进. EF Core集成 EF Core是微软的ORM,可以使用它与主流的数据库提供商 ...