python常见面试题04深浅拷贝

#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
@file: interview04.py 
@time: 2022/8/28 22:05
@desc:
"""
import copy


"""
浅拷贝大白话就是浅一点的拷贝,深拷贝就是深一点的拷贝,不过这个和拷贝对象的数据层次
也有一定的关系,如果数据结构本身就是一层的,例如字符串、数字,只有一层的列表和字典
那么此时深浅拷贝的意义是一样的,只有对于多层的数据,深浅拷贝的不同之处才能体现出来
"""

# 浅拷贝
m = {"key1": ['value1', 'value2']}
n = copy.copy(m)
# 查看一下m、n的内存地址,发现m、n的内存地址是不同的,说明
# 在进行浅拷贝的时候n还是开辟出了一块新的内   存
print(id(m))
print(id(n))

print('==============================================')

# 接下来看一下嵌套在m、n中的数据是什么情况,在本例中是一个list
print(id(m['key1']))
print(id(n['key1']))

print('==============================================')

# 输出结果发现m、n子对象的内存地址是一样的,说明浅拷贝的时候是原来
# 子对象的引用而已,两者是会同步变化的
# 我们来验证一下,给子对象追加一个元素看看
m['key1'].append('value3')
print(m)
print(n)


# 测试结果发现,m中的子对象值追加了,那么n同步发生改变了,这种拷贝在数据量
# 大的时候会节省很多内存,可见浅拷贝还是很有意义的

print('==============================================')

# 深拷贝
# 同样的我们来研究一下深拷贝,就会发现两者之间的区别了
m = {"key1": ['value1', 'value2']}
n = copy.deepcopy(m)
# 查看一下m、n的内存地址,发现m、n的内存地址是不同的,说明
# 在进行深拷贝的时候n开辟出了一块新的内存
print(id(m))
print(id(n))

print('==============================================')

# # 接下来看一下嵌套在m、n中的数据是什么情况,在本例中是一个list
print(id(m['key1']))
print(id(n['key1']))

print('==============================================')

# 输出结果发现m、n子对象的内存地址是不一样的,说明深拷贝的时候
# 会创建新的对象,两者是不会同步变化的
# 我们来验证一下,给子对象追加一个元素看看
m['key1'].append('value3')
print(m)
print(n)

# m新加了value3,n中没有同步变化,说明两者确实是没有关系的,互不影响的
# 不过由此就可以看出深拷贝的问题,如果有大量数据的时候深拷贝会要求有很多的内存
# 要注意内存大小的问题了
发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章