Python之copy模块使用
在python中,无论是直接的变量赋值,还是参数传递,都是按照引用进行赋值的,所以在日常开发过程中,我们经常需要用到对象拷贝功能。
copy模块则提供了浅拷贝和深拷贝功能。
- **浅拷贝:**obj.copy()
- **深拷贝:**obj.deepcopy()
# 浅拷贝
**浅拷贝:**只拷贝第一层的数据
# encoding=utf-8
# copy 复制对象
import logging
import copy
logging.basicConfig(level = logging.DEBUG, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
obj = {
"name":"myname",
"phone": {
"home":"123456"
}
}
# 浅拷贝
obj1 = copy.copy(obj);
obj1['name'] = "gitlib";
obj['phone']['home'] ="456789";
logger.debug(obj)
logger.debug(obj1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
输出结果:
DEBUG - {'phone': {'home': '456789'}, 'name': 'myname'}
DEBUG - {'phone': {'home': '456789'}, 'name': 'gitlib'}
1
2
2
因为浅拷贝只拷贝了第一层数据,其他层级数据还是引用原始对象的,所以改变原始对象的数据,浅拷贝的对象非第一层数据也会发生变化。
# 深拷贝
**深拷贝:**递归拷贝没一层的数据
# encoding=utf-8
# copy 复制对象
import logging
import copy
logging.basicConfig(level = logging.DEBUG, format='%(levelname)s - %(message)s')
logger = logging.getLogger(__name__)
obj = {
"name":"myname",
"phone": {
"home":"123456"
}
}
# 深拷贝
obj1 = copy.deepcopy(obj);
obj1['name'] = "gitlib";
obj1['phone']['home'] ="456789";
logger.debug(obj)
logger.debug(obj1)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
输出结果:
DEBUG - {'phone': {'home': '123456'}, 'name': 'myname'}
DEBUG - {'phone': {'home': '456789'}, 'name': 'gitlib'}
1
2
2
可以看出,深拷贝之后的对象和原对象完全独立。
上次更新: 2022/12/01, 11:09:34