Python语法进阶学习--可变与不可变类型以及深浅拷贝

一. 可变和不可变类型

  • 可变类型与不可变类型:
    在不改变内存地址的情况下,能否改变其中的数据,若能则是可变类型,若不能则是不可变类型。
  • 可变类型
    • 列表
    • 字典
    • 集合
  • 不可变类型
    • 数值类型(整型/浮点型/布尔)
    • 字符串
    • 元组
  • 引用可以理解一种指向,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发生改变
原列表的值改变,新列表的值不跟着变
原列表和新列表完全没有任何关联!
"""
  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值