乔克视界 乔克视界
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档

乔克

云原生爱好者
首页
  • 运维
  • 开发
  • 监控
  • 安全
  • 随笔
  • Docker
  • Golang
  • Python
  • AIOps
  • DevOps
  • 心情杂货
  • 读书笔记
  • 面试
  • 实用技巧
  • 博客搭建
友链
关于
收藏
  • 分类
  • 标签
  • 归档
  • Docker

  • Golang

  • AIOps

  • Python

    • 基础知识

      • Python之链表
      • Python 之类的初识
      • Python之函数式编程
      • Python之匿名函数
      • Python之自定义函数
      • Python之异常处理
      • Python之条件与循环
      • Python之列表生成式
      • Python之生成器
      • Python之装饰器
      • Python之迭代器
      • Python之进程、线程、协程
      • Python之深浅拷贝
        • 浅拷贝
        • 深拷贝
      • Python之反射
      • Python之并发编程
      • Python之垃圾回收机制
      • Python之断言assert
      • Python之上下文管理器和with语句
      • Python中JSON的对应关系
      • Python之单例模式
    • Django框架

    • 其他

  • DevOps

  • 专栏
  • Python
  • 基础知识
乔克
2025-07-19
目录

Python之深浅拷贝

在 python 中有 6 种标准的数据类型,它们分别是可变的和不可变的,其中有 3 种是不可变的,它们分别是 Number,String,Tuple;另外 3 种是可变的,它们分别是 List,Dictionary,Set.

# 浅拷贝

浅拷贝用 copy 模块中的 copy()方法实现,它有如下特点:

(1)、对于不可变类型,浅拷贝仅仅是地址指向,不会开辟新的空间;

(2)、对于可变类型,浅拷贝会开辟新的空间(仅仅是最顶层开辟空间,里层不会改变);

(3)、浅拷贝后,如果改变原始数据中可变类型的值,拷贝后对象的值也会受影响,如果改变原始数据中不可变类型的值,只有原始数据受影响,拷贝后对象的值不受影响;

例如对于不可变类型:

## Number
>>> num1 = 66
>>> num2 = copy.copy(num1)
>>> print("num1:{}".format(id(num1)))
num1:140718733224624
>>> print("num2:{}".format(id(num2)))
num2:140718733224624

## String
>>> str1 = "hello"
>>> str2 = copy.copy(str1)
>>> print("str1:{}".format(id(str1)))
str1:2953634367896
>>> print("str2:{}".format(id(str2)))
str2:2953634367896

## Tuple
>>> tup1 = (1,2)
>>> tup2 = copy.copy(tup1)
>>> print("tup1:{}".format(id(tup1)))
tup1:2953634226824
>>> print("tup2:{}".format(id(tup2)))
tup2:2953634226824
>>>

## 分别修改原始数据
>>> num1 = 77
>>> num2
66
>>> str1 = "world"
>>> str2
'hello'
>>> tup1 = (3,4)
>>> tup2
(1, 2)
>>>
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
27
28
29
30
31
32
33
34
35
36

对于可变数据类型,例如:

## List
>>> list1 = [1,2,3]
>>> list2 = copy.copy(list1)
>>> print("list1:{}".format(id(list1)))
list1:2953634215688
>>> print("list2:{}".format(id(list2)))
list2:2953634365192
>>> list11 = [4,5,[6,7,8]]
>>> list12 = copy.copy(list11)
>>> print("list11:{}".format(id(list11)))
list11:2953634365064
>>> print("list12:{}".format(id(list12)))
list12:2953634365320

## Dictionary
>>> dict1 = {"name": "joker", "age": 18}
>>> dict2 = copy.copy(dict1)
>>> print("dict1:{}".format(id(dict1)))
dict1:2953634147640
>>> print("dict2:{}".format(id(dict2)))
dict2:2953634194272

## Set
>>> set1 = {'a','b'}
>>> set2 = copy.copy(set1)
>>> print("set1:{}".format(id(set1)))
set1:2953634207336
>>> print("set2:{}".format(id(set2)))
set2:2953634208232

## 对原始数据进行修改
>>> list1[0]=100
>>> list2
[1, 2, 3]
>>> dict1["age"]=33
>>> dict2
{'name': 'joker', 'age': 18}
>>> list11[0]=400
>>> list12
[4, 5, [6, 7, 8]]
>>> list11[2][1]=600
>>> list12
[4, 5, [6, 600, 8]]
>>>
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

如果原始数据是可变类型,如下:

>>> list3 = [100,200,300]
>>> list4 = [500,600,700]
>>> num = 999
>>> list34 = [list3, list4, num]
>>> list56 = copy.copy(list34)
>>> num = 888
>>> list34
[[100, 200, 300], [500, 600, 700], 999]
>>> list56
[[100, 200, 300], [500, 600, 700], 999]
>>> list3[0]=1000
>>> list34
[[1000, 200, 300], [500, 600, 700], 999]
>>> list56
[[1000, 200, 300], [500, 600, 700], 999]
>>>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

# 深拷贝

深拷贝用 copy 模块中 deepcopy()方法实现,它有如下特点:

(1)、深拷贝就是克隆了一份,完全复制;

(2)、经过深拷贝后,原始对象和新拷贝的对象是相互独立的;

对于只有一层的数据,深拷贝和浅拷贝几乎一致,因为深拷贝更多的是强调递归,强调的是资源数,如下:

>>> list3 = [100,200,300]
>>> list4 = [500,600,700]
>>> num = 999
>>> list34 = [list3, list4, num]
>>> list78 = copy.deepcopy(list34)
>>> num = 888
>>> list34
[[100, 200, 300], [500, 600, 700], 999]
>>> list78
[[100, 200, 300], [500, 600, 700], 999]
>>> list3[0]=1000
>>> list34
[[1000, 200, 300], [500, 600, 700], 999]
>>> list78
[[100, 200, 300], [500, 600, 700], 999]
>>>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

本例是跟浅拷贝做对比的。

在之前的浅拷贝中,子元素是不会开辟新空间做拷贝的。

而在深拷贝中,子元素也进行了拷贝。

作者:乔克

本文链接:https://jokerbai.com

版权声明:本博客所有文章除特别声明外,均采用 署名-非商业性-相同方式共享 4.0 国际 (CC-BY-NC-SA-4.0) 许可协议。转载请注明出处!

上次更新: 2025/07/19, 11:33:23
Python之进程、线程、协程
Python之反射

← Python之进程、线程、协程 Python之反射→

最近更新
01
使用 Generic Webhook Trigger 触发 Jenkins 多分支流水线自动化构建
07-19
02
使用Zadig从0到1实现持续交付平台
07-19
03
基于Jira的运维发布平台
07-19
更多文章>
Theme by Vdoing | Copyright © 2019-2025 乔克 | MIT License | 渝ICP备20002153号 |
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式