Python语法进阶学习--可变与不可变类型以及深浅拷贝
2023-12-26 18:18:13
一. 可变和不可变类型
- 可变类型与不可变类型:
在不改变内存地址的情况下,能否改变其中的数据,若能则是可变类型,若不能则是不可变类型。 - 可变类型
- 列表
- 字典
- 集合
- 不可变类型
- 数值类型(整型/浮点型/布尔)
- 字符串
- 元组
- 引用可以理解一种指向,python中=号赋值的本质就是建立或改变引用
演示:引用、不可变类型、可变类型的推导过程如下
# a、b、c三个变量都引用(指向)了10
a = 10
b = a
c = a
print(id(a), id(b), id(c), id(10)) # id都一样
# a不再指向10,bc还指向10
a = 20
print(id(a), id(20), id(b), id(c)) # a变了,bc没变
# 函数调用传参 都是引用传递 id一致
num = 10001
print(id(num))
def func(my_num):
print(id(my_num))
func(my_num=num)
# 可变类型示例,两个list的id始终没有变化,但是数据内容改变了,说明列表是可变类型
my_list = [1, 2, 3]
your_list = my_list
print(id(my_list), id(your_list)) # 2493095416896 2493095416896
my_list[0] = 'hahaha'
print(id(my_list), my_list) #2493095416896 ['hahaha', 2, 3]
print(id(your_list), your_list) #2493095416896 ['hahaha', 2, 3]
#不可变类型示例
#修改字符串中的数据,本质是产生一个新的字符串,原字符串数据没有发生改变,其id也没有变化
#新的字符串的内容和原字符串不一样,id也和原字符串的id不一样
my_str1 = "123hello"
my_str2 = my_str1.replace("123","456")
print(id(my_str1),my_str1) #2493095464624 123hello
print(id(my_str2),my_str2) #2493095464880 456hello
二. 深浅拷贝
图片参考链接:
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
直接赋值
其实就是对象的引用(别名)。
2.1 浅拷贝
拷贝父对象,不会拷贝对象的内部的子对象。
2.2 深拷贝
copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。
示例
list1 = [1, 2, [3, 4]]
list2 = list1.copy()
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
list1[2][0] = 5
print('修改了list1中的某个值')
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
"""
结论:这是【浅拷贝】!
通过copy函数,复制的对象的id发生了改变
原列表的值改变,新列表的值也跟着变
"""
# 导包使用 deepcopy深拷贝函数
from copy import deepcopy
list1 = [1, 2, [3, 4]]
list2 = deepcopy(list1)
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
list1[2][0] = 5
print('修改了list1中的某个值')
print("list1:", list1, id(list1))
print("list2:", list2, id(list2))
"""
结论:这是【深拷贝】!
通过copy.deepcopy函数,复制的对象不光id发生改变
原列表的值改变,新列表的值不跟着变
原列表和新列表完全没有任何关联!
"""
文章来源:https://blog.csdn.net/Yan_bigdata/article/details/135223108
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!