pyhton中的深浅copy

深浅拷贝:数据分离情况

1. =赋值:数据完全共享(指向内存中的同一个对象)
被赋值的变量指向的数据和原变量的数据都是指向内存中的同一个地址:

  • (1)如果是不可变数据类型(数字、字符串等),修改其中的一个值,实际是修改了变量指向与值对应的地址(相当于重新被赋值),因此会同时发生变化;
  • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
 1 print("以下是赋值")
 2 a=[1,2,"4",[4,5]]
 3 b=a
 4 print(a)
 5 print(b)
 6
 7 b[0]=11
 8 b[3][0]=44
 9 print(a)
10 print(b)
11
12
13 #结果:
14 #以下是赋值
15 #[1, 2, ‘4‘, [4, 5]]
16 #[1, 2, ‘4‘, [4, 5]]
17 #[11, 2, ‘4‘, [44, 5]]
18 #[11, 2, ‘4‘, [44, 5]]

 2. 浅copy:数据半共享(仅可变数据类型指向同一个对象)
复制其数据独立内存存放(新建一个地址指向),但是只拷贝成功第一层:

  • (1)如果是不可变数据类型(数字、字符串等),修改其中一个变量的值,由于浅copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
  • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,但是指向可变数据类型的地址并未改变,因此会同时发生改变。
 1 print("以下是浅拷贝")
 2
 3 a=[1,2,"4",[4,5]]
 4 b=a.copy()
 5 print(a)
 6 print(b)
 7
 8 b[0]=11
 9 b[3][0]=44
10 print(a)
11 print(b)
12
13 结果:
14 以下是浅拷贝
15 [1, 2, ‘4‘, [4, 5]]
16 [1, 2, ‘4‘, [4, 5]]
17 [1, 2, ‘4‘, [44, 5]]
18 [11, 2, ‘4‘, [44, 5]]

  

3. 深copy:数据完全不共享(数据独立,互不影响)
复制其数据完完全全放独立的一个内存,完全拷贝,数据不共享:

  • (1)如果是不可变数据类型(数字、字符串等),修改其中一个变量的值,由于深copy的两个变量的地址指向独立,因此只有本身值被修改的变量发生变化,另一个不会改变;
  • (2)如果是可变数据类型(列表、字典等),在修改数据时仅仅是其本身的地址指向发生了改变,由于是深copy,指向可变数据类型的地址完全独立,因此另一个变量不会发生改变。
import copy
print("以下是深拷贝")

a=[1,2,"4",[4,5]]
b=copy.deepcopy(a)
print(a)
print(b)

b[0]=11
b[3][0]=44
print(a)
print(b)

结果:
以下是深拷贝
[1, 2, ‘4‘, [4, 5]]
[1, 2, ‘4‘, [4, 5]]
[1, 2, ‘4‘, [4, 5]]
[11, 2, ‘4‘, [44, 5]]

原文地址:https://www.cnblogs.com/open-yang/p/10852211.html

时间: 2024-11-06 12:41:31

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]: id(a) Out[5]: 4452948992 In [6]: id(b) Out[6]: 4452948992 In [7]: id(1) Out[7]: 4452948992 In [8]: a = 4 In [9]: b Out[9]: 1 In [10]: id(a) Out[10]:

python中的深浅Copy

二,深浅copy 1,先看赋值运算. l1 = [1,2,3,['barry','alex']] l2 = l1 l1[0] = 111 print(l1) # [111, 2, 3, ['barry', 'alex']] print(l2) # [111, 2, 3, ['barry', 'alex']] l1[3][0] = 'wusir' print(l1) # [111, 2, 3, ['wusir', 'alex']] print(l2) # [111, 2, 3, ['wusir',

【python】-- 深浅copy、集合

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

Python中的深浅拷贝详解

要说明Python中的深浅拷贝,可能要涉及到下面的一系列概念需要简单说明下: 变量-引用-对象(可变对象,不可变对象)切片-拷贝-浅拷贝-深拷贝 [变量-对象-引用] 在Python中一切都是对象,比如说: 3, 3.14, 'Hello', [1,2,3,4],{'a':1}...... 甚至连type其本身都是对象,type对象 Python中变量与C/C++/Java中不同,它是指对象的引用 单独赋值: 比如说: >>> a = 3 在运行a=3后,变量a变成了对象3的一个引用.在

python深浅copy探究

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

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

基础数据类型之集合和深浅copy,还有一些数据类型补充

集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系测试,测试两组数据之前的交集.差集.并集等关系. #关于集合和波尔值之间的苟苟且且# set ={1,2,3,4,5,True,(1,2,3),} #集合具有自动去重和去空格功能# set.add(False)# set.add(True) #打印结果显示,没有Teue,应该是集合内部的数字和元组不

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)

Python_赋值和深浅copy

Python中赋值和深浅copy存储变化 在刚学python的过程中,新手会对python中赋值.深浅copy的结果感到丈二和尚.经过多次在网上查找这几个过程的解释说明以及实现操作观察,初步对这几个过程有了浅显的认识.以下内容仅是我在学习过程中遇到的问题,然后上网搜验证,最后理解.博文也许没有将这部分内容写明白,也许有不对的地方,如果有大佬看到希望能指点一下新人.随着后面的学习以及理解会再次补充此内容. id函数 id方法的返回值就是对象的内存地址 执行赋值语句 在python中执行一条赋值语句