pyhton中的深浅copy
深浅拷贝:数据分离情况
1. =赋值:数据完全共享(指向内存中的同一个对象)
被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址:
- (1)如果是不可变数据类型(数字、字符串等),修改其中的一个值,实际是修改了变量指向与值对应的地址(相当于重新被赋值),因此不会同时发生变化;
- (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
print("以下是赋值")
a=[1,2,"",[4,5]]
b=a
print(a,id(a))
print(b,id(b)) b[0]=11
b[3][0]=44
print(a)
print(b) #结果:
#以下是赋值
# [1, 2, '4', [4, 5]] 119820576
# [1, 2, '4', [4, 5]] 119820576
# [11, 2, '4', [44, 5]]
# [11, 2, '4', [44, 5]]
2. 浅copy:数据半共享(仅可变数据类型指向同一个对象)
复制其数据独立内存存放(新建一个地址指向),但是只拷贝成功第一层:
- (1)如果是不可变数据类型(数字、字符串等),共用其地址,但修改其中一个变量的值,由于浅copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
- (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
print("以下是浅拷贝") a=[1,2,"",[4,5]]
b=a.copy()
print(a,id(a),id(a[0]),id(a[-1]))
print(b,id(b),id(b[0]),id(b[-1])) b[0]=11
b[3][0]=44
print(a)
print(b) # 结果:
# 以下是浅拷贝
[1, 2, '', [4, 5]] 127947040 1350511760 128225072
[1, 2, '', [4, 5]] 56886776 1350511760 128225072
[1, 2, '', [44, 5]]
[11, 2, '', [44, 5]]
3. 深copy:数据完全不共享(数据独立,互不影响)
复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享:
- (1)如果是不可变数据类型(数字、字符串等),修改其中一个变量的值,由于深copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
- (2)如果是可变数据类型(列表、字典等),深拷贝完全复制独立的一份,在修改数据时仅仅是其本身的地址指向发生了改变,由于是深copy,指向可变数据类型的地址完全独立,因此另一个变量不会发生改变。
import copy
print("以下是深拷贝") a=[1,2,"",[4,5]]
b=copy.deepcopy(a)
print(a,id(a),id(a[0]),id(a[-1]))
print(b,id(b),id(b[0]),id(b[-1])) b[0]=11
b[3][0]=44
print(a)
print(b) 结果:
以下是深拷贝
[1, 2, '', [4, 5]] 123425056 1350511760 123703088
[1, 2, '', [4, 5]] 52233720 1350511760 123700448
[1, 2, '', [4, 5]]
[11, 2, '', [44, 5]]
pyhton中的深浅copy的更多相关文章
- python列表中的深浅copy
列表中的赋值和平常的赋值是不一样的,看下面的代码: In [1]: a = 1 In [2]: b = a In [3]: a Out[3]: 1 In [4]: b Out[4]: 1 In [5] ...
- python中的深浅copy
https://www.cnblogs.com/Eva-J/p/5534037.html 转自Eva_J 分析的特别好
- python 的内存回收,及深浅Copy详解
一.python中的变量及引用 1.1 python中的不可变类型: 数字(num).字符串(str).元组(tuple).布尔值(bool<True,False>) 接下来我们讲完后你就 ...
- Python中的代码块及其缓存机制、深浅copy
一.代码块及其缓存机制 代码块 一个模块.一个函数.一个类.一个文件等都是一个代码块:交互式命令下,一行就是一个代码块. 同一个代码块内的缓存机制(字符串驻留机制) 机制内容:Python在执行同一个 ...
- python基础3(元祖、字典、深浅copy、集合、文件处理)
本次内容: 元祖 字典 浅copy和深copy 集合 文件处理 1.1元祖 元祖(tuple)与列表类似,不同之处在于元祖的元素不能修改,元祖使用小括号(),列表使用方括号[].元祖创建很简单,只需要 ...
- python学习笔记三 深浅copy,扩展数据类型(基础篇)
深浅copy以及赋值 对于字符串和数字而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址. import copy n1 = #n1 = 'hahahaha' #赋值n2 = n1#浅co ...
- Python 第三篇(下):collections系列、集合(set)、单双队列、深浅copy、内置函数
一.collections系列: collections其实是python的标准库,也就是python的一个内置模块,因此使用之前导入一下collections模块即可,collections在py ...
- Python 基础之函数、深浅copy,set及练习
三元运算符通常在Python里被称为条件表达式,这些表达式基于真(true)/假(not)的条件判断,在Python 2.4以上才有了三元操作. 语法格式: X if C else Y 有了三元表达式 ...
- python基础(三)编码,深浅copy
编码,深浅copy encode,decode在python2中使用的一些迷糊,python3中更容易理解 要理解encode和decode,首先我们要明白编码,字符和二进制的相关概念,简单来说,计算 ...
随机推荐
- SQLI-LABS学习笔记(四)
第十六关 和之前的关卡一样,修改闭合,无意义的关卡 ")闭合即可 第十七关 这题从源码上看发现 这里进行了两次查询 先查询了用户名是否存在 再查询密码是否匹配 ...
- udp包最大数据长度是多少
因为udp包头有2个byte用于记录包体长度. 2个byte可表示最大值为: 2^16-1=64K-1=65535 udp包头占8字节, ip包头占20字节, 65535-28 = 65507 ...
- Spring5参考指南:IOC容器
文章目录 为什么使用Spring5 什么是IOC容器 配置元数据 实例化容器 XML嵌套 groovy bean定义DSL 使用容器 最近在翻译Spring Framework Documentati ...
- mysql-管理命令【创建用户、授权、修改密码、删除用户和授权、忘记root密码】
一.创建用户 命令: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 关键参数说明: username - 创建登录用户名, host ...
- CHIL-SQL-DELETE 语句
DELETE 语句 DELETE 语句用于删除表中的行. 语法 DELETE FROM 表名称 WHERE 列名称 = 值 Person: LastName FirstName Address Cit ...
- Python之路【第二十八篇】:生成器与迭代器
#!/usr/bin/env python # -*- coding:utf-8 -*- #只要函数的代码里面出现了yield关键字,这个函数就不再是一个普通的函数了,叫做生成器函数 #执行生成器函数 ...
- IIS6服务器的请求流程(图文&源码)
1.IIS 7开发与管理完全参考手册 http://book.51cto.com/art/200908/146040.htm 2.Web服务IIS 6 https://technet.micro ...
- Java——Java连接Jira,创建、修改、删除工单信息
还不了解Jira是什么的同学可以看一下这篇文章:https://www.cnblogs.com/wgblog-code/p/11750767.html 本篇文章主要介绍如何使用Java操作Jira,包 ...
- Listener:监听器
目录 Listener概述 ServletContextListener Listener概述 web的三大组件之一 Servlet.Filter.Listener 事件监听机制 事件:一件事情 事件 ...
- Java 常用API(一)
目录 Java 常用API(一) 1. Scanner类 引用类型的一般使用步骤 Scanner的使用步骤 例题 2. 匿名对象 概述 匿名对象作为方法的参数 匿名对象作为方法的返回值 3. Rand ...