Python——深浅Copy

时间:2023-03-09 13:22:34
Python——深浅Copy

1. 赋值

  赋值:指向同一块内存地址,所以同时改变

l1 = [1,2,3]
l2 = l1
l1.append('a')
print(l1,l2) # [1, 2, 3, 'a'] [1, 2, 3, 'a']

2.copy

  (1)浅copy--copy

    对于浅copy来说,第一层创建的是新的内存地址。
    而从第二层开始,指向的是同一个内存地址,所以,对于第二层以及更深的层数来说,保持一致性。
    第一层都是独立的,改一个不会影响另一个----整体的(最外层)内存地址不一致。
    从第二层开始是公用的,改一个都会变----嵌套的(内层)内存地址一样。

#(1)一层——各自独立
l1 = [1,2,3]
l2 = l1.copy()
print(l1,l2) #[1,2,3] [1,2,3]
print(id(l1),id(l2)) #2727834966216 2727834105928
l2.append('a')
print(l1,l2) #[1,2,3] [1,2,3,'a']
''''''
#(2)两层——外层各自独立,内层同时改变
l1 = [1,2,[4,5,6],3]
l2 = l1.copy()
print(l1,id(l1)) #[1,2,[4,5,6],3] 1906050021448
print(l2,id(l2)) #[1,2,[4,5,6],3] 1906079848520
l1.append('a')
print(l1,l2) #[1,2,[4,5,6],3,'a'] [1,2,[4,5,6],3]
l1[2].append('a')
print(l1,l2) #[1,2,[4,5,6,'a'],3,'a'] [1,2,[4,5,6,'a'],3]
# 为什么l2中有'a'?
# 浅copy只有外层独立,内层时同时改变的

  (2)深copy--deepcopy

    复制前后是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。

import copy
#(2)深copy:复制前后是完全独立的,改变任意一个的元素(无论是多少层),另一个绝不会改变。
l1 = [1,2,[4,5,6],3]
l2 = copy.deepcopy(l1)
print(l1,id(l1)) #[1,2,[4,5,6],3] 2656767367304
print(l2,id(l2)) #[1,2,[4,5,6],3] 2656767368136
l1[2].append('a')
print(l1,l2) #[1,2,[4,5,6,'a'],3] [1,2,[4,5,6],3]