我的Python学习之路八:浅拷贝与深拷贝

取精华,去糟粕;重基础,促创新

一.浅拷贝与深拷贝

1.可变(mutable)参数和不可变(immutable)参数

 Python中string、tuple和number是不可变对象,而dict、list等是可变对象;不可变对象在进行重新赋值的时候,实际上是将原始值丢弃,将变量指向一个新值;可变对象的可变性实质上是指更改可变对象中的子对象,比如list中的item元素的更改。

2.深拷贝与浅拷贝

直接赋值:其实就是对象的引用(别名).

浅拷贝:

不拷贝子对象(针对子对象中的item),当子对象进行更改的时候,原始对象也会改变。常见操作:列表的切片[:]操作、list()操作,copy()函数、copy模块的copy()函数(两个一模一样的双胞胎)

深拷贝:

会拷贝子对象,当对原始对象子对象进行更改的时候,原始对象不会改变.常见操作:copy模块的deepcopy()函数

例如:

 

import copy

list_0 = ["A","B", ["C", "D"], "E"]

list_1 = copy.copy(list_0)#调用copy模块下的copy函数

list_2 = list_0.copy()

list_3 = list_0[:]

list_4 = list(list_0)

# --- 深拷贝的拷贝方式 ---

list_d = copy.deepcopy(list_0)

# --- 深浅拷贝的区别 ---

# 1. 对第一层数据进行赋值

list_0[0] = "X0"

list_1[0] = "X1"

list_2[0] = "X2"

list_3[0] = "X3"

list_4[0] = "X4"

list_d[0] = "Xd"

# 打印结果: 理所当然,所有列表都发生了变化

# list_0: ['X0', 'B', ['C', 'D'],E]

# list_1: ['X1', 'B', ['C', 'D'],E]

# list_2: ['X2', 'B', ['C', 'D'],E]

# list_3: ['X3', 'B', ['C', 'D'],E]

# list_4: ['X4', 'B', ['C', 'D'],E]

# list_d: ['Xd', 'B', ['C', 'D'],E]

# 2. 对第二层的list引用进行赋值

list_0[2][0] = "Y0"

list_1[2][0] = "Y1"

list_2[2][0] = "Y2"

list_3[2][0] = "Y3"

list_4[2][0] = "Y4"

list_d[2][0] = "Yd"

# 打印结果:0-1都被改成了同一个值,这说明浅拷贝只拷贝了第二层list的引用;而深拷贝则拷贝了数据结构

# list_0: ['X0', 'B', ['Y4', 'D'],E]

# list_1: ['X1', 'B', ['Y4', 'D'],E]

# list_2: ['X2', 'B', ['Y4', 'D'],E]

# list_3: ['X3', 'B', ['Y4', 'D'],E]

# list_4: ['X4', 'B', ['Y4', 'D'],E]

# list_d: ['Xd', 'B', ['Yd', 'D'],E]

二.内置函数表(了解)

查看命令:dir(__builtins__)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值