♣
题目部分(原文见公众号:python宝)
python宝
https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzU5NjIyOTE4OQ==&scene=123#wechat_redirect
小麦苗DB宝
https://www.xmmup.com/
4、不可变数据类型:value值改变,id值也随之改(int、数字、元组)
5、可变数据类型:value值改变,id值不变,(字典型、列表型)
6、深拷贝和浅拷贝一样,都会创建一个新的容器对象(compound object),和浅拷
贝的不同点在于,深拷贝对于对象中的元素,深拷贝都会重新生成一个新的对象
7、改变列表中不可变对象不影响浅拷贝,改变列表中的可变对象时浅拷贝也会改变
8、原列表的可变和不可变数据做什么改变都不会影响深拷贝对象
9、赋值语句并没有生成新的容器,跟浅拷贝的区别在于外面的容器也是指向的a的内存地址,并没有生成新的容器
10、可变、不可变、id
可变对象:可变对象可以在其 id() 保持固定的情况下改变其取值;俗点讲就是一个对象在修改它的值时候,不会改变该对象所指向的内存地址。
不可变对象:具有固定值的对象。不可变对象包括数字、字符串和元组。这样的对象不能被改变。如果必须存储一个不同的值,则必须创建新的对象。
id(object):函数用于获取对象的内存地址,函数返回对象的唯一标识符,标识符是一个整数。
♣
答案部分
import copy
print("########################浅拷贝###########################")
# 改变列表中的不可变对象,不影响浅拷贝,改变列表中的可变对象,浅拷贝也会改变
a = [1, "hello", [2, 3], {"key": "123"}]
b = copy.copy(a)
# 原a和浅拷贝b容器对象id不一样
print("原列表id:", id(a))
print("浅拷贝id:", id(b))
'''
原列表id:58401776
浅拷贝id:58401696
'''
# 原a和浅拷贝b容器里面的元素对象id一样
print("原列表里可变对象id:", id(a[2]))
print("浅拷贝后可变对象id", id(b[2]))
'''
原列表里可变对象id:58401856
浅拷贝后可变对象id 58401856
'''
# 改变a的 数字和字符串对象
a[0] = 2
# a 和b 的值不一样了
print("改变不可变对象后的a:", a)
print("改变不可变对象后的b:", b)
'''
[2, 'hello', [2, 3], {'key': '123'}]
[1, 'hello', [2, 3], {'key': '123'}]
'''
# 但是后面的元素还是指的a
print("改变不可变对象后的a:", id(a[2]))
print("改变不可变对象后的b:", id(b[2]))
'''
58401856
58401856
'''
# 改变a的 可变对象 [2, 4]
a[2][1] = 4
print("改变可变对象后的a:", a)
print("改变可变对象后的b:", b)
'''
[2, 'hello', [2, 4], {'key': '123'}]
[1, 'hello', [2, 4], {'key': '123'}]
'''
print("改变可变对象后的a:", id(a[2]))
print("改变可变对象后的b:", id(b[2]))
'''
58401856
58401856
'''
print("##########################深拷贝########################")
# 原列表的可变和不可变数据做什么改变都不会影响深拷贝对象
a = [1, "hello", [2, 3], {"key": "123"}]
b = copy.deepcopy(a)
print("原列表a: ", id(a)) # 外面容器拷贝了,所以a和b的id不一样
print("深拷贝列表b: ", id(b))
'''
58359680
58401776
'''
# a和b容器里面的元素对象id
print("原列表中可变对象id:", id(a[2]))
print("深拷贝中可变对象id:", id(b[2]))
'''
58401736
58359000
'''
# 改变a的 可变对象 [2, 4]
a[1] = 3
a[2][1] = 4
print("原列表改变可变对象:", a)
print("深拷贝中改变可变对象:", b)
'''
原列表改变可变对象:[1, 3, [2, 4], {'key': '123'}]
深拷贝中改变可变对象:[1, 'hello', [2, 3], {'key': '123'}]
'''
print("原列表改变可变对象id:", id(a[2]))
print("深拷贝中改变可变对象id:", id(b[2]))
'''
58401736
58359000
'''
print("############################赋值#############################")
a = [1, "hello", [2, 3], {"key": "123"}]
b = a
print("原列表:", id(a))
print("赋值后:", id(b))
'''
58401856
58401856
'''
# a和b容器里面的元素对象id
print("原列表中id:", id(a[2]))
print("赋值后id", id(b[2]))
'''
58401696
58401696
'''
a[0] = 2
a[2][1] = 5
print("原列表:", a)
print("赋值修改后", b)
'''
原列表:[2, 'hello', [2, 5], {'key': '123'}]
赋值修改后 [2, 'hello', [2, 5], {'key': '123'}]
'''
参考:https://blog.51cto.com/u_15249893/2848109?abTest=1
https://copyfuture.com/blogs-details/2020031720252559878eggumgw4iaj7c
https://blog.51cto.com/moshenglv/2170378?abTest=1
https://blog.51cto.com/topic/pythonqiankaobeiheshenkaobeimianshiti.html?page=8
About Me:小麦粒
● 本文作者:小麦粒,专注于python、数据分析、数据挖掘、机器学习相关技术,也注重技术的运用
● 作者博客地址:https://blog.csdn.net/u010986753
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● 个人微信号:pythonbao 联系我加微信群
● 个人QQ:87605025
● QQ交流群py_data :483766429
● 公众号:python宝 或 DB宝
● 提供OCP、OCM和高可用最实用的技能培训
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
如果你觉得到文章对您有帮助,点击下方我的头像,赞赏我哦!
有您的支持,小麦粒一定会越来越好!