取精华,去糟粕;重基础,促创新
一.浅拷贝与深拷贝
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__)