python之深浅copy与id
我们都知道 所谓变量就是就是在空间中开辟一块内存空间。来存放东西的
学过c语言的都知道而数组也是有内存地址的
我们如何来查看内存地址呢?id()这函数就来了
x = 5
print(id(x))
如此一来我们就可以查看x的内存地址了他的内存地址是
1940307088
首先我们来看一个现象
我们把数组赋值给一个变量a 然后在把a赋值给b 在来改变a的值 看看b 是否会发生变化呢?
a = [1,2,3]
b = a
a[0] = 11
print(b)
得出的结果是
[11, 2, 3]
很显然发生了变化,这是什么原因造成的呢?最好的办法就是查一下他们的id
print(id(a) == id(b))
结果是 True
很显然他们指向了同一块内存地址, 为什么会出现这种情况呢?我们在学c语言的是时候啊 知道数组的地址就是数组的首地址,所以我们可以直接赋值,
但是内存地址没有发生改变。为了解决这一情况,我们可以采用copy的方法来将数据拷贝出来
首先 我们import 出copy的库来
import copy
a = [1,2,3]
b = copy.copy(a)
a[0] = 11
print(b)
print(id(a) == id(b))
我们看一下结果
[1, 2, 3]
False
可以看出我们地址不相同了 现在改变数组里面的元素也与b无关了
哪我们升级一下改变一下难度 我们把a 变成
a = [1,2,[1,2,3]]
import copy
a = [1,2,[1,2,3]]
b = copy.copy(a)
a[2][0] = 11
print(b)
结果是
[1, 2, [11, 2, 3]]
我擦居然还是变了,这是怎么回事?你发现只能copy第一层 于是你不甘心你又加了字典
import copy
a = [1,2,[1,2,3],{'wocao':123456}]
b = copy.copy(a)
a[3]['wocao'] = 11
print(b)
结果是
[1, 2, [1, 2, 3], {'wocao': 11}]
于是你恍然大悟啊。。。。原来copy只能浅浅的copy一层啊!!!
还好你上课听讲,听见了老师说了深深的copy,于是你又拿出来试试
import copy
a = [1,2,[1,2,3],{'wocao':123456}]
b = copy.deepcopy(a)
a[3]['wocao'] = 11
a[2][1] = 11
print(b)
得出来
[1, 2, [1, 2, 3], {'wocao': 123456}]
好家伙原来是这么回事啊
python之深浅copy与id的更多相关文章
- Python的深浅copy详解
Python的深浅copy详解 目录 Python的深浅copy详解 一.浅copy的原理 1.1 浅copy的定义 1.2 浅copy的方法 二.深copy的原理 2.1 深copy的定义 2.2 ...
- Python的深浅copy
27.简述Python的深浅拷贝以及应用场景? 深浅拷贝的原理 深浅拷贝用法来自copy模块. 导入模块:import copy 浅拷贝:copy.copy 深拷贝:copy.deepcopy 字面理 ...
- Python 集合 深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- python集合深浅copy
一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. ...
- Python之深浅copy与字符编码
一.深浅copy 1. 首先看赋值运算 l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barr ...
- python之深浅copy
深浅copy 1.赋值运算 a = [1, 2, 3] b = a a.append(666) print(b) #output:[1, 2, 3, 666] 对于赋值运算来说,a与b指向的是同一个内 ...
- 【python】-- 深浅copy、集合
深浅copy 1.数字.字符串的copy: 赋值(=).浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址: >>> import copy & ...
- python基础--深浅copy(重点)
在此申明一下,博客参照了https://www.cnblogs.com/jin-xin/,自己做了部分的改动 深浅copy(重点) 先问问大家,什么是拷贝?拷贝是音译的词,其实他是从copy这个英文单 ...
- day python calss08 深浅copy
一 join (格式: . join) 遍历列表把列表中的每一项用指定符号进行拼接.(把列表转成字符串0 # lst = ["汪峰", "吴君如", &q ...
随机推荐
- c++程序设计实践——银行系统
银行系统 本科大二程序设计实践的作业,算是一个比较简单的项目吧,主要使用的编程范式有面向对象编程 其中引入<multimap><map>头文件实现多映射输出存取记录 引入< ...
- selenium-绕过登录
第一种方式:chrome-debug 1.现在终端输入一下命令,启动Chrome-debug模式 #windows a.首先将chrome的环境添加到PATH中 b.进入cmd 命令栏,输入:chro ...
- selenium-滚动
移动到指定的坐标(相对当前的坐标移动) driver.execute_script("window.scrollBy(0, 700)"); 移动到窗口绝对位置坐标,如下移动到纵坐标 ...
- phpstorm 使用xdebug
一.在phpstudy配置 开启xdebug的zend扩展,在php.ini 中添加下面的代码: [xdebug] zend_extension = "D:\phpstudy_pro\Ext ...
- zookeeper核心之ZAB协议就这么简单!
背景 我们都知道 Zookeeper 是基于 ZAB 协议实现的,在介绍 ZAB 协议之前,先回顾一下 Zookeeper 的起源与发展. Zookeeper 究竟是在什么样的时代背景下被提出?为了解 ...
- Vue基础语法(四)
vue的生命周期钩子函数 所有的生命周期钩子自动绑定this到上下文实例中,因此可以访问数据对property和方法进行运算,这意味着不蹦使用箭头函数来定义一个生命周期方法.参考官方文档,生命周期图 ...
- LruCache缓存bitmap(一)
Lrucache是把图片缓存到内置sd卡,设置缓存容量为系统分配容量的八分之一,单位byte,超过缓存容量gc会自动回收不长使用的缓存.觉得lrucache就先map一样,放入键值对就行了,比较方便, ...
- D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)
Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...
- Error response from daemon: conflict: unable to delete a2f2e369e78e (cannot be forced) - image has dependent child images
错误现象: Error response from daemon: conflict: unable to delete a2f2e369e78e (cannot be forced) - image ...
- Kubernetes 搭建 ES 集群(存储使用 local pv)
一.集群规划 由于当前环境中没有分布式存储,所以只能使用本地 PV 的方式来实现数据持久化. ES 集群的 master 节点至少需要三个,防止脑裂. 由于 master 在配置过程中需要保证主机名固 ...