参考资料:
python内存可视化
预备知识
1、python数据类型
不可变数据类型:数字、字符串、元祖
可变数据类型:列表、集合、字典
不可变数据类型都不能通过切片的方式修改值,我们要修改只能重新开辟一块内存空间。
2、is和==
is比较内存地址
==比较元素值
一、赋值:b = a
无论元素是可变还是不可变,修改一个,二者内容都变
1、id相同,值相同:指向一块内存区域
>>> a = [1,2,3]
>>> b = a
>>> a is b
True
2、修改b元素值,a元素值也会变
二、切片是浅拷贝!b = a[:]
浅复制:
- 生成一个新的列表
- 把原列表中所选元素的引用都复制到新列表中。
1、如果是append对引用原地操作,则a也会被修改
2、如果是赋新值,则指向新值的引用,和原a就无关了
三、append(传入引用)
append是原地操作
1、lst.append(可变元素),可变元素修改,则lst内容也变化
b = []
c = [1,23] # 可变元素:列表
b.append(c)
c[1] = 100 #修改c,b也变化
2、lst.append(不可变元素),不可变元素修改,lst内容不变
b = []
c = 'hello'
b.append(c)
c = 'newstring'
3、回溯类题目注意点:传入res_lst的子列表,要通过切片使之独立传入,否则递归过程元素会统一修改
四、深拷贝:b = copy.deepcopy(a)
新旧列表所有元素完全独立
只有刚复制来的元素值完全相同
# 引入标准库copy中的deepcopy()函数
import copy
a = ['cc',[1,2,3],{'age':[2,3,4]}]
b = copy.deepcopy(a)
>>> a is b
False
>>> a == b
True
五、切片是原地修改
非切片:不改变内部子数组
切片赋值