'''
作者:lg
日期:2019/9/7
文件描述:列表深浅copy
缺陷：
'''

# 列表赋值操作
lst1 = ['a', 'b', 'c', 'd']
# 底层解释:首先在内存里创建一块空间,存储['a', 'b', 'c', 'd'],在命名空间里创建一个变量lst1
# 接着把['a', 'b', 'c', 'd']内存的地址0X1234赋值给lst1
# 形成一个指向关系,lst1存储的地址 ---> ['a', 'b', 'c', 'd']所在的空间

lst2 = lst1
# 错误理解:lst1和lst2是同一块内存空间,其实并不是,是两块不同的变量,只不过存着的是同一个地址,该地址指向一个列表内存
# 解释:再在命名空间里创建一个新变量lst2,把list1存储的值赋值给list2,实际上是列表内存地址的赋值操作
# 此时内存中只有一个列表,但是有两个变量都指向它
print('lst1', lst1)
lst2.append('ZZZZ')
print('lst2', lst2)
print('lst1', lst1)

# 浅拷贝
l1 = [1, 2, 3]
l2 = l1.copy()
l2.append('AAA')
print(l1)
print(l2)

l1 = [1, 2, ['a']]
l2 = l1.copy()
# 上面操作类似于这样:
#         l1 = [1, 2, ['a']]
#         l2 = []
#         for el in l1:
#             l2.append(el)
# 原因分析:遍历列表l1,把列表l1里的每个元素赋值一份到列表l2里,这里需要注意!!!!!当元素是列表时,只是进行了列表名变量lst2 = lst1的操作,
# 只是列表内存地址的赋值操作,并没有新创建一个列表空间
# 所以,这里是'列表赋值操作'

l2[2].append('CCC')
print(l1)
print(l2)

# 另一种写法
l2 = l1[:]
# 切片会产生新对象

# 深拷贝
# 深拷贝相对于重新创建对象,分配内存来说很快
import copy

l1 = [1, 2, ['a']]
l2 = copy.deepcopy(l1)
l2[2].append('AAA')
print(l1)
print(l2)

