codecamp

Python深浅拷贝

深浅拷贝

深浅拷贝分为两部分,一部分是数字和字符串另一部分是列表、元组、字典等其他数据类型。

数字和字符串

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

1
<span style="font-family:arial, helvetica, sans-serif;font-size:18px;"># 导入copy模块>>> import copy# 定义一个变量var1>>> var1 = 123<br># 输出var1的内存地址>>> id(var1)1347747440>>> var2 = var1<br># var2的内存地址和var1相同>>> id(var2)1347747440<br># 浅拷贝>>> var3 = copy.copy(var1)<br># var3的内存地址和var1相同>>> id(var3)1347747440<br># 深拷贝>>> var4 = copy.deepcopy(var1)# var4的内存地址和var1相同>>> id(var4)1347747440<br></span>

其他数据类型

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

  • 创建一个字典var1

1
<span style="font-family:arial, helvetica, sans-serif;font-size:18px;">var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}<br></span>

赋值

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

1
<span style="font-family:arial, helvetica, sans-serif;font-size:18px;">>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}>>> var2 = var1>>> id(var1)1937003361288>>> id(var2)1937003361288<br></span>

如图所示:

浅拷贝

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

1
<span style="font-family:arial, helvetica, sans-serif;font-size:18px;"># 导入拷贝模块>>> import copy>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}<br># 使用浅拷贝的方式>>> var2 = copy.copy(var1)<br># 两个变量的内存地址是不一样的>>> id(var1)2084726354952>>> id(var2)2084730248008# 但是他们的元素内存地址是一样的>>> id(var1["k1"])2084726207464>>> id(var2["k1"])2084726207464<br></span>

如图所示:

深拷贝

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

1
<span style="font-family:arial, helvetica, sans-serif;font-size:18px;"># 导入拷贝模块>>> import copy>>> var1 = {"k1": "1", "k2": 2, "k3": ["abc", 456]}<br># 使用深拷贝的方式把var1的内容拷贝给var2>>> var2 = copy.deepcopy(var1)<br># var1和var2的内存地址是不相同的>>> id(var1)1706383946760>>> id(var2)1706389852744<br># var1和var2的元素"k3"内存地址是不相同的>>> id(var1["k3"])1706389853576>>> id(var2["k3"])1706389740744# var1和var2的"k3"元素的内存地址是相同的>>> id(var1["k3"][1])1706383265744>>> id(var2["k3"][1])1706383265744<br></span>

如图所示:


本文出自 “一盏烛光” 博客,谢绝转载!

Python之Win字符编码详解
Python之文件操作
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }