赋值、浅拷贝、深拷贝
赋值
创建了一个到对象的引用,不开辟新的内存空间。
浅拷贝
-
浅拷贝不可变对象
同赋值
-
浅拷贝可变对象
将原来的对象空间的内容直接复制一份到新的空间中
tips:
a = [1, 2, [1, 2]] b = copy.copy(a)
b 所指的对象空间中会有三个内容:
1, 2 和指向[1, 2]的一个指针。
改变b中的[1, 2]的元素, a中的[1, 2]也会改变,因为a和b的第三个元素,列表指针指向同一片空间。
引起浅拷贝的操作:切片操作,工厂函数,copy.copy()
深拷贝
-
深拷贝不可变对象
同赋值
-
深拷贝可变对象
生成一个和原对象完全互不影响的对象。
引起深拷贝的操作:copy.deepcopy()
代码实例
#id()函数:获取对象的内存地址
import copy
def main():
### 赋值 ###
a = [0, 0]
b = a
b[0] = 1
print(f'a = {a}')
print(f'b = {b}')
print(f'id(a) == id(b) : {id(a) == id(b)}')
""""
a = [1, 0]
b = [1, 0]
id(a) == id(b) : True
""""
### 浅拷贝 ###
# 不可变对象
a = (1, 2, 3)
b = copy.copy(a)
print(f'id(a) == id(b) : {id(a) == id(b)}')
""""
id(a) == id(b) : True
""""
# 可变对象
a = [1, 2, [1, 2]]
b = copy.copy(a)
b[0] = 0
b[2][0] = 0
print(f'a = {a}')
print(f'b = {b}')
print(f'id(a) == id(b) : {id(a) == id(b)}')
print(f'id(a[2]) == id(b[2]) : {id(a[2][0]) == id(b[2][0])}')
""""
a = [1, 2, [0, 2]]
b = [0, 2, [0, 2]]
id(a) == id(b) : False
id(a[2]) == id(b[2]) : True
""""
### 深拷贝 ###
# 不可变对象
a = (1, 2, 3)
b = copy.deepcopy(a)
print(f'id(a) == id(b) : {id(a) == id(b)}')
""""
id(a) == id(b) : True
""""
# 可变对象
a = [1, 2, [1, 2]]
b = copy.deepcopy(a)
b[0] = 0
b[2][0] = 0
print(f'a = {a}')
print(f'b = {b}')
print(f'id(a) == id(b) : {id(a) == id(b)}')
print(f'id(a[2]) == id(b[2]) : {id(a[2][0]) == id(b[2][0])}')
"""
a = [1, 2, [1, 2]]
b = [0, 2, [0, 2]]
id(a) == id(b) : False
id(a[2]) == id(b[2]) : False
"""
if __name__ == '__main__':
main()