转载:https://www.cnblogs.com/ctztake/p/8194275.html

术语

  • 变量:是一个系统表的元素,拥有指向对象的连接空间。
  • 对象:被分配的一块内存,存储其所代表的值。
  • 引用:是自动形成的从变量到对象的指针。
  • 注意:类型(int类型,long类型(python3已除去))对于对象,不是变量。
  • 不可变对象:一旦创建就不可修改的对象,包括字符串,元组,数字。
  • 可变对象:可以修改的对象,包括列表,字典。(可通过hash()来判断对象是否可变)

关于python3深浅拷贝,会以下面三个点来讲述。

先说下copy,这里定义的copy,是指在内存里完全是两块独立的内存空间(既id值不一样),如果两个变量是引用同一个对象的内存地址(id值一样),则不叫copy。

  1. 赋值
  2. 浅copy
  3. 深copy

数字和字符串

对于数字和字符串而言,赋值、深浅拷贝毫无意义,因为他们的值永远都会纸箱同一个内存地址。

# 导入copy模块
>>> import copy
# 定义一个变量var1
>>> var1 =
# 输出var1的内存地址
>>> id(var1)

>>> var2 = var1
# var2的内存地址和var1相同
>>> id(var2)

# 浅拷贝
>>> var3 = copy.copy(var1)
# var3的内存地址和var1相同
>>> id(var3)

# 深拷贝
>>> var4 = copy.deepcopy(var1)
# var4的内存地址和var1相同
>>> id(var4)

其他数据类型

对于字典、元组、列表而言,进行赋值,深浅拷贝时,其内存地址的变化是不同的。

  • 创建一个字典var1
var1 = {, ]}

1.赋值

在python中对象的赋值其实就是对象的引用。当创建一个对象,把它赋值给另一个变量的时候,python并没有拷贝这个对象,只是拷贝了这个对象的引用而已。

>>> var1 = {, ]}
>>> var2 = var1
>>> id(var1)

>>> id(var2)
1937003361288##var1, var2引用的同一个字典对象(内存地址一样),  所以该字典的任何改动,都会影响到var1,var2

如图:

2.浅拷贝

浅拷贝: 浅拷贝值只拷贝一层,具有自己单独的内存地址。二层或其他层不拷贝,指向原有的内存地址。

# 导入拷贝模块
>>> import copy
>>> var1 = {, ]}
# 使用浅拷贝的方式
>>> var2 = copy.copy(var1)
# 两个变量的内存地址是不一样的
>>> id(var1)

>>> id(var2)

# 但是他们的元素内存地址是一样的
>>> id(var1["k1"])

>>> id(var2["k1"])
2084726207464

##浅copy只拷贝一层,也就是'k1' 'k2'以及所对应的值完全是两份数据,没有关联,修改了var1的'k1',var2不会有影响。 对于'k3'的值来说,不属于第一次内容,所以修改会互相影响。

如图:

3.深copy

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

# 导入拷贝模块
>>> import copy
>>> var1 = {, ]}
# 使用深拷贝的方式把var1的内容拷贝给var2
>>> var2 = copy.deepcopy(var1)
# var1和var2的内存地址是不相同的
>>> id(var1)

>>> id(var2)

# var1和var2的元素"k3"内存地址是不相同的
>>> id(var1["k3"])

>>> id(var2["k3"])
# var1和var2的"k3"元素的内存地址是相同的
>>> id(var1["k3"][1])
1706383265744
>>> id(var2["k3"][1])
1706383265744
 

python3-深浅copy的更多相关文章

  1. python基础(三)编码,深浅copy

    编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...

  2. Python学习之路基础篇--07Python基础+编码、集合 和 深浅Copy

    1 小数据池(节省内存) 只有数字和字符串中内存,储存在同一个内存地址中 数字的范围在-5~256中,字符串有以下两个特点:不能含有特殊字符,还有就s*20 不是同一个地址,而要*21就不是了 2 编 ...

  3. python 浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  4. 数据结构中的列表、元组、字典、集合 ,深浅copy

    数据结构:数据结构是计算机存储数据和组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.在python中主要的数据类型统称为容器. 而序列(如列表.元组).映射(如字典).集合 ...

  5. python浅析格式化输出和深浅copy

    一,格式化输出 今天主要想记录一下关于格式化输出的例子,然后结合了自己的理解,分析如下: 格式是 :百分号+占位符 主要有三种使用形式:%s  (其中s表示string)表示字符串 %d  (其中d表 ...

  6. python基础3(元祖、字典、深浅copy、集合、文件处理)

    本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...

  7. python学习笔记三 深浅copy,扩展数据类型(基础篇)

    深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...

  8. Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数

     一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...

  9. Python 基础之函数、深浅copy,set及练习

    三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...

  10. Python 集合 深浅copy

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

随机推荐

  1. 剑指Offer_编程题_7

    题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项. n<=39 class Solution { public: int Fibonacci(int n) ...

  2. 正态分布-python建模

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  3. 浅析基于ARM的Linux下的系统调用的实现

    在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...

  4. Event Recommendation Engine Challenge分步解析第五步

    一.请知晓 本文是基于: Event Recommendation Engine Challenge分步解析第一步 Event Recommendation Engine Challenge分步解析第 ...

  5. Maven 本地资源库配置

    Maven 本地资源库配置 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.操作系统环境 1>.查看操作系统环境(总共3台虚拟机) 2>.关闭防火墙并禁用开机自启动( ...

  6. Expressions versus statements in JavaScript

    Statements and expressions An expression produces a value and can be written wherever a value is exp ...

  7. source命令导入大数据速度慢优化

    XX市邮政微商城的项目数据库,300多M,约220万条数据,source命令导入花了20个小时左右,太不可思议. 速度慢原因:220多万条数据,就 insert into 了220多万次,下图: 这是 ...

  8. Ext.net资源地址

    nuget:https://www.nuget.org/packages/Ext.NET/4.1.0 示例:https://examples1.ext.net/#/GridPanel/WebServi ...

  9. 群发技术-使用python3给微信好友群发消息

    本文介绍如何给个人微信好友群发消息. 微信个人号中的群发助手可以一次给30个发送消息,如果要给所有所有群发,则需要自己手动发送多次,或者借助程序实现了.本文即是程序实现教程 一.原理 在微信的官方网站 ...

  10. getservbyname和getservbyport

    一.getservbyname函数原型 #include <netdb.h> struct servent *getservbyname(const char *servname, con ...