1.Python中拷贝分为浅拷贝与深拷贝
简单来说:深拷贝就是把要拷贝的对象整体复制一份,存在新开辟的空间里; 而浅拷贝指的是,对于要拷贝的对象要复制一份,但是对于其内部的子对象就不复制了, 而是直接引用,也就是类似于添加了一个链接而已。
虽然两者表面效果差不多,但是内层却大不相同。
面试常问:请简述赋值, 深拷贝和浅拷贝的区别?(python中如何拷贝一个对象?)
- 直接赋值( li1 = li ): 只传递对象的引用, li1指向对象li的内存地址空间,
因此, 原有列表li改变, 被赋值的li1也会做相应的改变.
- 浅拷贝(三种实现方式( ) eg: li2 = li.copy( ) ):li和li2的内存地址不同,
但是子对象的内存地址相同, 因此,原始数据改变 , 子对象也改变.
- 深拷贝(import copy, eg: li3=copy.deepcopy(li)), li和li3的内存地址不同,
包含子对象的拷贝, 所以原始对象改变并不会造成深拷贝里面任何子项的改变.
以下对上述情况进行一一验证:
直接赋值:
a = [1,2,3]
id(a)
140526875481608
b = a
id(b)
140526875481608
a.append(8)
a
[1, 2, 3, 8]
b
[1, 2, 3, 8]
浅拷贝:
- li.copy( )
- li [ : ]
- copy.copy( li )
a = [['z','x'],5,6]
b = a[:]
c = a.copy()
id(a),id(b),id(c)
(140526894578120, 140526901551752, 140526901552392)
a.append(4)
a,b,c
([['z', 'x'], 5, 6, 4], [['z', 'x'], 5, 6], [['z', 'x'], 5, 6])
a[0].append("y")
a,b,c
([['z', 'x', 'y'], 5, 6, 4], [['z', 'x', 'y'], 5, 6], [['z', 'x', 'y'], 5, 6])
深拷贝:
导入copy函数,使用copy.deepcopy( )作为深拷贝
但此函数中的copy.copy( )为浅拷贝
- copy.copy( )
import copy a = [['z','x'],5,6] d = copy.copy(a) id(a),id(d) print(a,d) a.append(4) print(a,d) a[0].append("r") print(a,d)
- copy.deepcopy( )
import copy
a = [['z','x'],5,6]
d = copy.deepcopy(a)
id(a),id(d)
print(a,d)
a.append(4)
print(a,d)
a[0].append("r")
print(a,d)
2.is和==的区别
变量:
id: 在内存中存储的位置;id(a)
value: ==
type:变量的数据类型; type(a)
== : value, type
is : 三个都判断
a = [1,2,3]
a = "1"
b = a
id(a),id(b)
(140526944818432, 140526944818432)
a == b ,a is b
(True, True)
a = [1,2,3]
b = [1,2,3]
id(a),id(b)
(140526875595976, 140526939868424)
a == b , a is b
(True, False)