Python中的赋值,浅拷贝和深拷贝的区别

赋值

内存地址的引用,所有的改变都会同步

测试代码

  1. #coding:utf-8
  2. import copy
  3. a=[‘a‘,‘b‘,1,[1,2,3]]
  4. b = a #对象赋值,所有改动都会联动
  5. a.append(‘d‘)
  6. a[0]=‘aaa‘
  7. a[3].append(4)
  8. print a
  9. print b

运行结果

  1. [‘aaa‘, ‘b‘, 1, [1, 2, 3, 4], ‘d‘]
  2. [‘aaa‘, ‘b‘, 1, [1, 2, 3, 4], ‘d‘]

浅拷贝

str,num等深浅拷贝都一样,list、dict可变类型 浅拷贝后都用以前的内存地址

测试代码

  1. #coding:utf-8
  2. import copy
  3. a=[‘a‘,‘b‘,1,[1,2,3]]
  4. b = copy.copy(a) #浅拷贝,复制了a,b,1的地址引用,对于可变量list、dict,浅拷贝后内存引用地址不变
  5. a.append(‘d‘) #对第一层元素新增对象,因为没有被拷贝,不会影响到b
  6. a[0]=‘aaa‘ #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
  7. a[3].append(4) #liest和dict为可变量,对list的修改,会影响到b
  8. print a
  9. print b

运行结果

  1. [‘aaa‘, ‘b‘, 1, [1, 2, 3, 4], ‘d‘]
  2. [‘a‘, ‘b‘, 1, [1, 2, 3, 4]]

一般使用list切片,set等都为浅拷贝操作

深拷贝

str,num等深浅拷贝都一样,list、dict可变类型 深拷贝后会引用新生成的内存地址

测试代码

  1. #coding:utf-8
  2. import copy
  3. a=[‘a‘,‘b‘,1,[1,2,3]]
  4. b = copy.deepcopy(a) #深拷贝,复制了a,b,1等不可变类型的地址引用,对于可变量list、dict,深拷贝后引用的是新的内存地址
  5. a.append(‘d‘) #对第一层元素新增对象,因为没有被拷贝,不会影响到b
  6. a[0]=‘aaa‘ #字符串为不可变量,所以会生成一个新的地址引用,所以也不会影响到b
  7. a[3].append(4) #liest和dict为可变量,深拷贝后,b中的list为新的内存地址,所以不会影响到b
  8. print a
  9. print b

运行结果

  1. [‘aaa‘, ‘b‘, 1, [1, 2, 3, 4], ‘d‘]
  2. [‘a‘, ‘b‘, 1, [1, 2, 3]]

总结

  • 对于两个变量需要联动一致的情况,可以使用赋值操作。
  • 对于拷贝后,对于list、dict类型数据需要联动的情况,可以使用copy浅拷贝,如list数据的共享情况
  • 对于拷贝后,对于list、dict类型数据需要进行独立的拷贝,不受影响,可以使用deepcopy深拷贝,类似获取某个时刻数据的分支副本,可使用deepcopy

来自为知笔记(Wiz)

时间: 2024-08-10 14:58:50

Python中的赋值,浅拷贝和深拷贝的区别的相关文章

js中对象的浅拷贝和深拷贝的区别

js中对象的浅拷贝和深拷贝的区别 浅度拷贝:复制一层对象的属性,并不包括对象里面的为引用类型的数据,当改变拷贝的对象里面的引用类型时,源对象也会改变. 深度拷贝:重新开辟一个内存空间,需要递归拷贝对象里的引用,直到子属性都为基本类型.两个对象对应两个不同的地址,修改一个对象的属性,不会改变另一个对象的属性. 数据的类型: 一般数据(值传递):字符,数值,布尔,undefined 拷贝(复制)时,传递的是值,修改新数据,不会影响老数据 复杂数据(引用传递):对象 拷贝(复制)时,传递的是内存地址的

python中赋值,浅拷贝,深拷贝的区别

1.首先,对被操作对象分类,对于不可变对象而言,如字符串.数字.tuple等,这三种操作是等价的,都是引用 import copy a='apple'b=ac=copy.copy(a)d=copy.deepcopy(a)print(id(a))print(id(b))print(id(c))print(id(d) 输出: 1840734496184073449618407344961840734496 可见,这四个变量都指向同一块内存地址,即'apple'这个字符串所在的地址 2.对可变对象(或

Python中浅拷贝和深拷贝的区别

Python中浅拷贝和深拷贝的区别 浅拷贝和深拷贝示意图 如上图,简单点说 1. copy.copy 浅拷贝 只拷贝父对象,不会拷贝对象的内部的子对象. 2. copy.deepcopy 深拷贝 拷贝对象及其子对象 数字,字符串是不可变类型 列表,字典是可变类型 我们看下面的案例 案例一:浅拷贝 >>> import copy     #导入copy模块                >>> s=['name',['savings',100.0]] #赋值给s >

一入python深似海--浅拷贝与深拷贝

python中有一个模块copy,deepcopy函数用于深拷贝,copy函数用于浅拷贝.要理解浅拷贝,必须先弄清楚python中的引用. 引用 Python中一切都是对象,变量中存放的是对象的引用.这是一个普遍的法则.可以说 Python 没有赋值,只有引用.如,a=1,变量a只是整数对象1的引用. 可变对象与不可变对象及其引用 一.不可变对象 不可变对象包括:数字,字符串,元组. 由于Python中的变量存放的是对象引用,所以对于不可变对象而言,尽管对象本身不可变,但变量的对象引用是可变的.

Python中的赋值和拷贝

赋值 在python中,赋值就是建立一个对象的引用,而不是将对象存储为另一个副本.例如: >>> a=[1,2,3] >>> b=a >>> c=a 对象是[1,2,3],分别由a.b.c三个变量其建立了对应的引用关系.而三个变量都不独占对象[1,2,3],或者说,可以通过任何一个变量来修改[1,2,3]这个对象. >>> c.append(4) >>> c [1, 2, 3, 4] >>> a [

python中的“赋值与深浅拷贝”

Python中,赋值与拷贝(深/浅拷贝)之间是有差异的,这主要源于数据在内存中的存放问题,本文将对此加以探讨. 1 赋值(添加名字) 赋值不会改变内存中数据存放状态,比如在内存中存在一个名为data的数据,此时若执行语句data_01 = data,则现在该份数据有了两个名称(data和data_01),其余都不发生改变,使用任何一个名称对数据进行操作,那么用另外一个名称拿数据时,数据会呈现之间发生的改变.示例如下: 图中,给列表分配了两个名称a与b,对a做改变时b会同样改变,对b做改变时a也会

Python中有关赋值的奇怪现象

下面看两个例子: 1) 2) 看到区别了吧~~ 在第1)个例子中a的值改变不影响b的值:而在2)例子中L1的值改变了会影响L2的值. 其实并不难理解,再看第3)个例子: 小结:如果是对整个变量重新赋值,则这个变量指向原来数值的指针会断掉,转而指向新的值:而如果只是对变量里面的一部分重新赋值(改变),则只不会断掉指针,这时改变的就是内存中的数值,其他指向这个数值的输出结果也会改变. Python中有关赋值的奇怪现象,布布扣,bubuko.com

Python中变量赋值的8种形式、需要注意哪些细节?

本文解释python中变量赋值的形式,并解释一些细节. python中变量赋值的几种形式 1 x = "long" # (1).基本形式 2 x, y = "long", "shuai" # (2).元组对应赋值 3 [x, y] = ["long", "shuai"] # (3).列表对应赋值 4 a, b, c, d = "long" # (4).序列赋值 5 a, *b = 'lo

python中_、__和__xx__的区别

python中_.__和__xx__的区别 本文为译文,版权属于原作者,在此翻译为中文分享给大家. 英文原文地址:Difference between _, __ and __xx__ in Python 在学习Python时,很多人都弄不清楚各种下划线的意思,而且在这之前已经给其他人解释过很多遍了,是时候把它记录下来. "_"单下划线 Python中不存在真正的私有方法.为了实现类似于c++中私有方法,可以在类的方法或属性前加一个“_”单下划线,意味着该方法或属性不应该去调用,它并不