简介

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 可变、不可变类型、深拷贝、浅拷贝理解的更多相关文章

  1. Python中的可变对象与不可变对象、浅拷贝与深拷贝

    Python中的对象分为可变与不可变,有必要了解一下,这会影响到python对象的赋值与拷贝.而拷贝也有深浅之别. 不可变对象 简单说就是某个对象存放在内存中,这块内存中的值是不能改变的,变量指向这块 ...

  2. Python(可变/不可变类型,list,tuple,dict,set)

    补充:(可用操作技巧) >>> x=900 >>> y=900 >>> x==y True >>> type(x) is typ ...

  3. 理解 Python 中的可变参数 *args 和 **kwargs:

    默认参数:  Python是支持可变参数的,最简单的方法莫过于使用默认参数,例如: def getSum(x,y=5): print "x:", x print "y:& ...

  4. 005 python 整数类型/字符串类型/列表类型/可变/不可变

    可变/不可变类型 可变类型 ID不变的情况下,值改变,则称之为可变类型,如列表,字典 不可变类型 值改变,ID改变,则称之为不可变类型,如 整数 字符串,元组 整数类型 int 正整数 用途就是记录年 ...

  5. 【04】Python 深拷贝浅拷贝 函数 递归 集合

    1 深拷贝浅拷贝 1.1 a==b与a is b的区别 a == b    比较两个对象的内容是否相等(可以是不同内存空间) a is b  比较a与b是否指向同一个内存地址,也就是a与b的id是否相 ...

  6. python集合增删改查,深拷贝浅拷贝

    集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...

  7. python 中的可变对象与不可变对象

    近日辞职待工,没有实际的项目与大家分享.暂写写在实际运用python中遇到的关于可变对象和不可变对象的坑. 首先我们需要明确一个概念,在python中一且皆对象.我们一般定义一个变量a=0,其实质a是 ...

  8. Python 拓展之详解深拷贝和浅拷贝

    正式开始 首先我在这介绍两个新的小知识,要在下面用到.一个是函数 id() ,另一个是运算符 is.id() 函数就是返回对象的内存地址:is 是比较两个变量的对象引用是否指向同一个对象,在这里请不要 ...

  9. Python中的赋值、深拷贝与浅拷贝(内存地址)

    Python中的赋值.深拷贝与浅拷贝(内存地址) 1.python中的可变对象与不可变对象 (1) 可变对象:dict,list def dict_test(): a = {} b = a print ...

  10. python中的可变与不可变对象

    Python中的可变对象和不可变对象 什么是可变/不可变对象 不可变对象,该对象所指向的内存中的值不能被改变.当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一 ...

随机推荐

  1. Blazor和Vue对比学习(基础1.5):双向绑定

    这章我们来学习,现代前端框架中最精彩的一部分,双向绑定.除了掌握原生HTML标签的双向绑定使用,我们还要在一个自定义的组件上,手撸实现双向绑定.双向绑定,是前两章知识点的一个综合运用(父传子.子传父) ...

  2. pytorch入门--土堆深度学习快速入门教程

    工具函数 dir函数,让我们直到工具箱,以及工具箱中的分隔区有什么东西 help函数,让我们直到每个工具是如何使用的,工具的使用方法 示例:在pycharm的console环境,输入 import t ...

  3. API 工程化分享

    概要 本文是学习B站毛剑老师的<API 工程化分享>的学习笔记,分享了 gRPC 中的 Proto 管理方式,Proto 分仓源码方式,Proto 独立同步方式,Proto git sub ...

  4. 117_PowerQuery使用ODBC访问带密码的Access

    博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载附件 一. 有朋友在问pq访问带密码的access的时候会报错,导致无法访问(如下图): 1.选择更多 图1 2.选择Acces ...

  5. [codeforces] 暑期训练之打卡题(一)

    每个标题都做了题目原网址的超链接 Day1<Vanya and Lanterns> 题意: 一条长度为 l 的街道,在这条街道上放置了n个相同的灯,街道一端位置记为0,每个灯的位置在ai处 ...

  6. MySQL之SQL语句优化

    语句优化 即优化器利用自身的优化器来对我们写的SQL进行优化,然后再将其放入InnoDB引擎中执行. 条件简化 移除不必要的括号 select * from x where ((a = 5)); 上面 ...

  7. vue新手入门之使用vue框架搭建用户登录注册案例,手动搭建webpack+Vue项目(附源码,图文详解,亲测有效)

    前言 本篇随笔主要写了手动搭建一个webpack+Vue项目,掌握相关loader的安装与使用,包括css-loader.style-loader.vue-loader.url-loader.sass ...

  8. 关于『HTML』:第三弹

    关于『HTML』:第三弹 建议缩放90%食用 盼望着, 盼望着, 第三弹来了, HTML基础系列完结了!! 一切都像刚睡醒的样子(包括我), 欣欣然张开了眼(我没有) 敬请期待Markdown语法系列 ...

  9. Django-Model随笔

    Django数据库之Model 常用命令 生成迁移文件 python manage.py makemigrations 实行数据库迁移 python manage.py migrate 数据库表结构反 ...

  10. 浅析 2D 组态与 2.5D 组态的区别 | 空调装配生产线与化工安全流程

    前言 为了更有效辨别 2D 与 2.5D 之间的区别,图扑软件选用 2D 空调装配生产线与 2.5D 化工厂安全流程作比较.通过自主研发的 HT 产品,采用 B/S 架构快速搭建零代码拖拽式 Web ...