copy

import copy

"""
	1. = 相当于引用,地址数据始终保持一致(即一个变化,另一个也变化)
	2. deepcopy 这个也好理解,就是完全的复制。数据地址完全不一样
		>> 注意一点:若被复制的数据为不可变数据,则数据地址不变
	3. copy 浅拷贝,这个需要重点理解下,它仅仅复制当前层,对于它的子集是不做复制的。
		也即子集若是可变的的,那么即便浅拷贝完毕。那么子集内容也会随之变化。
		
	# 个人认为重点理解,python中内存的分配方式,
"""

def copy_test_01():
	a = (1,2,3)
	b = a
	c = copy.copy(a)
	d = copy.deepcopy(a)

	print(a is b)
	print(a is c)
	print(a is d)

	print(a == b)
	print(a == c)
	print(a == d)
	
	print(a)
	print(b)
	print(c)
	print(d)
	
	print(id(a))
	print(id(b))
	print(id(c))
	print(id(d))
	print('-----------01------------')

def copy_test_02():
	a = [1,2,3]
	b = a
	c = copy.copy(a)
	d = copy.deepcopy(a)

	a[0] = 0
	
	print(a is b)
	print(a is c)
	print(a is d)

	print(a == b)
	print(a == c)
	print(a == d)
	
	print(a)
	print(b)
	print(c)
	print(d)
	
	print(id(a))
	print(id(b))
	print(id(c))
	print(id(d))
	print('-----------02------------')
	

def copy_test_03():
	a = [1,2,(3,4,5)]
	b = a
	c = copy.copy(a)
	d = copy.deepcopy(a)

	a[0] = 0
	a[2] = [6,7,8]
	
	print(a is b)
	print(a is c)
	print(a is d)

	print(a == b)
	print(a == c)
	print(a == d)
	
	print(a[2] is b[2])
	print(a[2] is c[2])
	print(a[2] is d[2])
	
	print(a)
	print(b)
	print(c)
	print(d)
	
	print(id(a))
	print(id(b))
	print(id(c))
	print(id(d))
	print('------------03-----------')	

def copy_test_04():

	a = (1,2,[3,4,5])
	c = copy.copy(a)
	d = copy.deepcopy(a)
	print(a)
	a[2][0] = 0
	print(a)
	print(a[2] is c[2])
	print(a[2] is d[2])
	print(a[2][0] is c[2][0])
	print(a[2][0] is d[2][0])
	print(c)
	print(d)
	print('------------04-----------')	

copy_test_01()
copy_test_02()
copy_test_03()
copy_test_04()