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}]

好家伙原来是这么回事啊



原文地址:https://www.cnblogs.com/BookMiki/p/10192870.html

时间: 2024-11-09 07:31:15

python之深浅copy与id的相关文章

python之深浅copy

三.深浅copy调用方法:import copy #浅拷贝copy.copy() 深拷贝copy.deepcopy() #赋值1. 对于 数字 和 字符串 而言,赋值.浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址.举例:import copy#字符串,数字a1 = 'adddddd'a2 = '12322'a2 = a1print(id(a1))print(id(a2))a3 = copy.deepcopy(a1)print(id(a1))print(id(a3))输出结果:4192344

【python】-- 深浅copy、集合

深浅copy 1.数字.字符串的copy: 赋值(=).浅拷贝(copy)和深拷贝(deepcopy)其实都一样,因为它们永远指向同一个内存地址: >>> import copy >>> n1 = 123 >>> print(id(n1)) #打印n1的内存地址 502665488 ##赋值## >>> n2 = n1 >>> print(id(n2)) 502665488 ##浅拷贝## >>>

Python 集合 深浅copy

一,集合. 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试,测试两组数据之前的交集.差集.并集等关系. 1,集合的创建. set1 = set({1,2,'barry'}) set2 = {1,2,'barry'} print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'} 2,集合的增. set1 =

python集合深浅copy

01昨天内容回顾 代码块:由一个文件,一个函数,一个模块,一个类,交互模式下每一行都是一个代码块 Is == id:id()是查询内存地址,==比较两边的值,is是比较两边的内存地址. 小数据池: 在内存中创建一个池,提前存放了-5~256的整数,一定规则的字符串,后续程序中,如果设置的变量指向的是小数据内容,那就不会再内存中重新创建. 1.节省内存 2.提高性能和效率. 小数据池和代码块的关系. 同一个代码块:python在执行时,遇到了初始化对象,他会将这个变量和数值放在一个字典中,再次遇到

python的深浅copy

#!/usr/bin/env python #-*- coding:utf-8 -*- a='abc' b=a a='def' print(b) #这里打印的是abc #1.执行a = 'abc',解释器创建了字符串'abc'和变量a,并把a指向'ABC' #2.执行b=a,解释器创建了变量b,并把变量b指向了变量a所指向的abc #3.执行a = 'def',解释器创建了字符串'def',并把a的指向改为'def',但b并没有更改: #所以最后打印的是abc name={ "z":{

python 列表深浅copy 及相关操作

1.浅COPY,如果源变化,p1[1][1].p2[1][1].person[1][1]会一起变化 import copyperson = ['name',['saving',100]]'''p1 = copy.copy(person)p2 = person[:]p3 = list(person)'''p1 = person[:]p2 = person[:]print(p1)print(p2) p1[0] = 'alex'p2[0] = 'fengjie'print(p1)print(p2) p

python 06 id is == set 深浅copy

01 今日内容大纲 is==id用法 代码块 同一代码下的缓存机制 不同代码下的缓存机制(小数据池) 总结 集合(了解,但金融有时候会用到) 深浅copy 02 昨日回顾 is id == 字典初识: 查询速度快,存储大量的关联性数据 键:是不可变数据类型,比如str bool int tuple,并且是唯一的 值:可以是任意数据类型,对象 字典3.5x之前是无序的,3.6x按照初始时的顺序排列,3.7之后是有序的 增删改查: 增:setdefault(),dic['age']=18 删:pop

python深浅copy探究

引入 在python程序中,如果我们操作一个变量的值去做运算,而又想在下次调用时,仍使用原来的变量的值去做运算,那么我们我们就需要将这个变量去做备份,这就是本文所要探究的问题. 开始 变量-对象-引用: python中全部皆对象,Python中变量是指对象(甚至连type其本身都是对象,type对象)的引用,Python是动态类型,程序运行时候,会根据对象的类型来确认变量到底是什么类型. 我们有时候会见到这样一种情况: a = 1 b = a 这样做不就是把数据copy了一份吗,错,这样做只是在

python之旅 1-29 补充内容,深浅copy

#  l1 = [111,222,333,444,555] 将索引为奇数位的元素删除. # l1 = [111,222,333,444,555] # del l1[1::2] # print(l1) 通过删除列表中的元素 # for i in range(len(l1)-1,0,-1): # if i%2==0: # del l1[i-1] # print(l1) 通过循环列表,用range指代索引位置 for i in l1: if l1.index(i)%2==0: l2.append(i)