【python之路13】python的深浅拷贝

补充day7-5:

列表和字典不能直接删除,如果要删除,则先遍历列表或字典,将要删除的值放在另一个列表,然后遍历另一个列表来删除此列表。

li = [11, 22, 33, 44, 55]
# 删除大于33的值
re = []
for el in li:
    if el > 33:
        re.append(el)

for el in re:
    li.remove(el)

print(li)  # [11, 22, 33]

深浅拷贝补充

浅拷贝

li中的[44, 55]实际是个内存地址,li1拷贝的时候拷贝了同一个内存地址

li = [11,22,33,[44,55]]
li1 = li.copy()
li[3].append(66)
print(li,li1) #[11, 22, 33, [44, 55, 66]]     [11, 22, 33, [44, 55, 66]]

深拷贝

import copy

li = [11, 22, 33, [44, 55]]
li1 = copy.deepcopy(li)
li[3].append(66)
print(li, li1)  # [11, 22, 33, [44, 55, 66]]    [11, 22, 33, [44, 55]]

深浅拷贝

一、数字和字符串

对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import copy
# ######### 数字、字符串 #########
n1 = 123
# n1 = "i am alex age 10"
print(id(n1))
# ## 赋值 ##
n2 = n1
print(id(n2))
# ## 浅拷贝 ##
n2 = copy.copy(n1)
print(id(n2))
  
# ## 深拷贝 ##
n3 = copy.deepcopy(n1)
print(id(n3))

二、其他基本数据类型

对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的。

1、赋值

赋值,只是创建一个变量,该变量指向原来内存地址,如:

1
2
3
n1 = {"k1""wu""k2"123"k3": ["alex"456]}
  
n2 = n1

  

2、浅拷贝

浅拷贝,在内存中只额外创建第一层数据

1
2
3
4
5
import copy
  
n1 = {"k1""wu""k2"123"k3": ["alex"456]}
  
n3 = copy.copy(n1)

3、深拷贝

深拷贝,在内存中将所有的数据重新创建一份(排除最后一层,即:python内部对字符串和数字的优化)

1
2
3
4
5
import copy
  
n1 = {"k1""wu""k2"123"k3": ["alex"456]}
  
n4 = copy.deepcopy(n1)

import copy

li = [11, 22, 33, [44, 55]]
li1 = copy.deepcopy(li)
li[3].append(66)
print(li, li1)  # [11, 22, 33, [44, 55, 66]]    [11, 22, 33, [44, 55]]
原文地址:https://www.cnblogs.com/sunshuhai/p/6294402.html