# _*_ coding : utf-8 _*_
# @Time : 2022/6/28 17:51
# @Author : wy
# @File : ShallowAndDeep
# @Project : python
import copy
# 列表的深浅拷贝:集合和字典与之类似
# 浅拷贝:虽然都是浅拷贝,但是和后三种不一样,后面三种不太浅
print('列表')
print('---列表直接赋值---')
list1 = [1, 2, 3]
list2 = list1
print("浅外:list1 is list2 ?",list1 is list2) # True
print("浅内:list1[0] is list2[0] ?",list1[0] is list2[0]) # True
print('-------')
# 列表中不够深的浅拷贝
print('---列表中不够深的浅拷贝---')
print('---list()---')
list1 = [1, 2, 3]
list2 = list(list1)
print("浅外:list1 is list2 ?",list1 is list2) # False
print("浅内:list1[0] is list2[0] ?",list1[0] is list2[0]) # True
print('-------')
print('---切片---')
list1 = [1, 2, 3]
list2 = list1[:]
print("浅外:list1 is list2 ?",list1 is list2) # False
print("浅内:list1[0] is list2[0] ?",list1[0] is list2[0]) # True
print('-------')
print('---copy.copy()---')
list1 = [1, 2, 3]
list2 = copy.copy(list1)
print("浅外:list1 is list2 ?",list1 is list2) # False
print("浅内:list1[0] is list2[0] ?",list1[0] is list2[0]) # True
print('-------')
# 浅拷贝存在的问题
print('---列表的深浅拷贝对比:浅拷使用list()---')
list1 = [[1, 2], (30, 40)]
list2 = list(list1)
print("浅外:list1 is list2 ?",list1 is list2) # False
print("浅内:list1[0] is list2[0] ?",list1[0] is list2[0]) # True
list1.append(100)
print("list1:",list1)
print("list2:",list2)
list1[0].append(3)
print("list1:",list1)
print("list2:",list2)
list1[1] += (50, 60)
print("list1:",list1)
print("list2:",list2)
print('-------')
# 深拷贝不会出现这样的问题
list1 = [[1, 2], (30, 40)]
list2 = copy.deepcopy(list1)
print("深内:list1 is list2 ?",list1 is list2) # False
print("深外:list1[0] is list2[0] ?",list1[0] is list2[0]) # False
list1.append(100)
print("list1:",list1)
print("list2:",list2)
list1[0].append(3)
print("list1:",list1)
print("list2:",list2)
list1[1] += (50, 60)
print("list1:",list1)
print("list2:",list2)
print('-------')
# 深拷贝存在的问题
print('---深拷贝存在的问题---')
list1 = [1]
list1.append(list1) # 列表不能自己追加自己
print(list1)
list2 = copy.deepcopy(list1) # 深拷贝也不行
print(list2)
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
# 数字和bool
# 浅拷贝
print('数字和bool')
print('---数字的深浅拷贝对比---')
a = 1
b = a
print("浅:a is b ?", a is b) # True
b = copy.deepcopy(a)
print("深:a is b ?", a is b) # True
print(a, b)
a = 2
print(b)
b = 3
print(a)
print('---Boolean的深浅拷贝对比---')
a = True
b = a
print("浅:a is b ?", a is b) # True
b = copy.deepcopy(a)
print("深:a is b ?", a is b) # True
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
# 元组和字符串这样的不可变类型不管什么方式都是浅拷贝
print('不可变类型')
print('---不可变类型的深浅拷贝对比---')
print('元组的深浅拷贝对比')
tuple1 = (1, 2, 3)
tuple2 = tuple(tuple1)
print("浅:tuple1 is tuple2 ?",tuple1 is tuple2) # True
tuple2 = copy.deepcopy(tuple1)
print("深:tuple1 is tuple2 ?",tuple1 is tuple2) # True
print('-------')
print('字符串的深浅拷贝对比')
s = 'hello'
s1 = s
print('浅:s is s1 ?', s is s1) # True
s = copy.deepcopy(s1)
print('深: is s1 ?', s is s1) # True
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')
print('-------')