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中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...
随机推荐
- Blazor和Vue对比学习(基础1.5):双向绑定
这章我们来学习,现代前端框架中最精彩的一部分,双向绑定.除了掌握原生HTML标签的双向绑定使用,我们还要在一个自定义的组件上,手撸实现双向绑定.双向绑定,是前两章知识点的一个综合运用(父传子.子传父) ...
- pytorch入门--土堆深度学习快速入门教程
工具函数 dir函数,让我们直到工具箱,以及工具箱中的分隔区有什么东西 help函数,让我们直到每个工具是如何使用的,工具的使用方法 示例:在pycharm的console环境,输入 import t ...
- API 工程化分享
概要 本文是学习B站毛剑老师的<API 工程化分享>的学习笔记,分享了 gRPC 中的 Proto 管理方式,Proto 分仓源码方式,Proto 独立同步方式,Proto git sub ...
- 117_PowerQuery使用ODBC访问带密码的Access
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一. 有朋友在问pq访问带密码的access的时候会报错,导致无法访问(如下图): 1.选择更多 图1 2.选择Acces ...
- [codeforces] 暑期训练之打卡题(一)
每个标题都做了题目原网址的超链接 Day1<Vanya and Lanterns> 题意: 一条长度为 l 的街道,在这条街道上放置了n个相同的灯,街道一端位置记为0,每个灯的位置在ai处 ...
- MySQL之SQL语句优化
语句优化 即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行. 条件简化 移除不必要的括号 select * from x where ((a = 5)); 上面 ...
- vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)
前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...
- 关于『HTML』:第三弹
关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...
- Django-Model随笔
Django数据库之Model 常用命令 生成迁移文件 python manage.py makemigrations 实行数据库迁移 python manage.py migrate 数据库表结构反 ...
- 浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程
前言 为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较.通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web ...