简介

python中数据分为可变类型,不可变类型。不同的数据类型影响着不同情况下的深浅拷贝。

下面则将简要介绍一下

可变类型

当某个数据的值发生改变时,它对应的内存地址不发生改变,常见的有列表、字典、集合

为什么可变类型,值发生变化,内存地址不会发生变化呢?

可变类型中拥有一个内存地址,其中值存放的是各个元素的内存地址,所以当值发生改变时(例如append)时只会在值中新增内存地址,不会对列表原有的内存地址造成修改

不可变类型

不可变类型:当某个数据的值发生改变时,它对应的内存地址也发生改变,常见的有字符串、元组、数字、布尔

深拷贝

深拷贝都会复制可变类型对象和不可变类型对象

  1. data = [1,2,3,"test", {1,2,3}, [1,2,3], {"name":"tom", "age":19}]
  2. copy_data = copy.deepcopy(data)
  3. print(copy_data)
  4. data[4].add(4)
  5. print("----------------")
  6. print(data)
  7. print(copy_data)
  8. print("----------------")
  9. data[5].append(4)
  10. print(data)
  11. print(copy_data)
  12. print("----------------")
  13. data[6]["gender"] = "man"
  14. print(data)
  15. print(copy_data)
  1. [1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  2. ----------------
  3. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  4. [1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  5. ----------------
  6. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
  7. [1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  8. ----------------
  9. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19, 'gender': 'man'}]
  10. [1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]

从上述结果来看,深拷贝后的数据与原数据是独立的,数据不会受到影响

浅拷贝

浅拷贝只会复制不可变类型对象,而可变类型对象复制的则是内存地址,当可变类型对象中的元素发生改变时,会影响到原有数据

  1. data = [1,2,3,"test", {1,2,3}, [1,2,3], {"name":"tom", "age":19}]
  2. copy_data = data.copy()
  3. print(copy_data)
  4. data[4].add(4)
  5. print("----------------")
  6. print(data)
  7. print(copy_data)
  8. print("----------------")
  9. data[5].append(4)
  10. print(data)
  11. print(copy_data)
  12. print("----------------")
  13. data[6]["gender"] = "man"
  14. print(data)
  15. print(copy_data)
  1. [1, 2, 3, 'test', {1, 2, 3}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  2. ----------------
  3. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  4. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3], {'name': 'tom', 'age': 19}]
  5. ----------------
  6. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
  7. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19}]
  8. ----------------
  9. [1, 2, 3, 'test', {1, 2, 3, 4}, [1, 2, 3, 4], {'name': 'tom', 'age': 19, 'gender': 'man'}]
  10. [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. Java 17中对switch的模式匹配增强

    还记得Java 16中的instanceof增强 吗? 通过下面这个例子再回忆一下: Map<String, Object> data = new HashMap<>(); d ...

  2. bean的自动装配,使用注解开发,使用java的方式配置Spring

    bean的自动装配 自动装配是Spring满足bean依赖一种方式! Spring会在上下文中自动寻找,并自动给bean装配属性! 在Spring中有三种装配的方式 在xml中显示的配置 在java中 ...

  3. 多线程07:async、future、packaged_task、promise

    async.future.packaged_task.promise 本节内容需要包含头文件:#include <future> 一.std::async. std::future 创建后 ...

  4. 抽象数据类型(ADT)

    抽象数据类型(Abstract Data Type,ADT)是指一个数学模型以及定义在这个模型上的一组操作.抽象数据类型的定义仅仅取决于它的一组逻辑特性,而与它在计算机中的表示和实现无关. 例如,in ...

  5. 使用 Flutter 与 Firebase 制作 I/O 弹球游戏

    文/ Very Good Ventures 团队,5 月 11 日发表于 Flutter 官方博客 为了今年的 Google I/O 大会,Flutter 团队使用 Flutter 以及 Fireba ...

  6. 【AC自动机】背单词

    题意: 0 s v:添加价值为v的字符串s 1 t:查询t中含的s的权值和.(不停位置算多次) 思路: 在线AC自动机. 同学用过一个妙妙子的分块算法. 这里用二进制分组:通常用作把在线数据结构问题转 ...

  7. IDEA初始化基础配置

    0.前言 这篇博客是给认识的那帮新手搞的,刚进入IT行业的崽们 这个东西配置好了,也可以选择弄成在线文档,下一次安装IDEA时,有一个import导入配置,然后就可以自己配置好了( 虽然方便,但不建议 ...

  8. Java开发学习(二)----IOC、DI入门案例

    一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...

  9. seafile私有网盘搭建

    各种公有网盘确实很方便,但总有些特殊情况不是? 闲来无聊准备自己搭建一个私有网盘,也让自己的闲置的服务器好好利用一下 搜索一番,找到了专业户seafile 一顿操作,踩了无数大坑,特此总结一下 1.c ...

  10. 点亮Arduino内置的LED灯

    更新记录 2022年4月16日:本文迁移自Panda666原博客,原发布时间:2021年9月3日. 15块软妹币的板子镇楼. 上一篇配置好了开发环境,然后就开始搞第一个小灯的实验了. 原理相当的简单, ...