Python中深浅拷贝原理详解:数值、字符串与复杂对象的区别

竹里
竹里
发布时间:2026-10-13 | 4人浏览过
原创

本文深入解析Python中的深浅拷贝机制,通过对比数值、字符串及字典等对象在赋值、浅拷贝和深拷贝下的内存地址变化,阐明其底层原理。文章指出不可变对象(如数值、字符串)始终共享同一内存地址,而可变对象的浅拷贝仅复制第一层引用,深拷贝则递归复制所有层级,帮助开发者避免常见的内存引用陷阱。

前言

在C++等语言中,参数传递通常分为值传递和引用传递两种形式,二者区别显著。若对此概念尚不清晰,建议自行补充相关知识。接下来,我们将通过具体的Python代码示例来直观展示这一机制,并在此基础上进行总结分析。代码如下:

# copy module import
import copy

# number and string
a = 12
a1 = a
a2 = copy.copy(a)
a3 = copy.deepcopy(a)
# look addr
print("==========number=======")
print(id(a))
print(id(a1))
print(id(a2))
print(id(a3))

s = '12345'
s1 = s
s2 = copy.copy(s)
s3 = copy.deepcopy(s)
# look addr
print("==========String=======")
print(id(s))
print(id(s1))
print(id(s2))
print(id(s3))

# others
target = {
  'name': 'ckmike',
  'age': 25,
  'boxes':[
    'LV',
    'Prada',
    'KUQI'
  ]
}
target1 = target
target2 = copy.copy(target)
target3 = copy.deepcopy(target)
print("==========dict-1=======")
print(id(target))
print(id(target1))
print(id(target2))
print(id(target3))
print("==========dict-2=======")
print(id(target['boxes']))
print(id(target1['boxes']))
print(id(target2['boxes']))
print(id(target3['boxes']))

输出结果:

==========number======= 10943360 10943360 10943360 10943360 ==========String======= 140567123944648 140567123944648 140567123944648 140567123944648 ==========dict-1======= 140567124625088 140567124625088 140567124625160 140567123938760 ==========dict-2======= 140567099339272 140567099339272 140567099339272 140567099339464

总结:

对于数值和字符串这类不可变对象而言,无论是使用赋值符号还是进行浅拷贝、深拷贝操作,变量最终都指向内存中同一份数据的地址,即它们共享相同的内存引用。而对于非数值、非字符串的可变对象(如字典、列表等),浅拷贝仅会复制对象的第一层结构,内部嵌套的可变对象仍保持引用关系;相比之下,深拷贝则会递归地复制所有层级的数据,生成完全独立的副本。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表