第一种:app
a = [[1,2], [3,4]] [_.append(666) for _ in a] # 原生列表 (for 也是同样的,图个方便,用了推导式) print(a) >> [[1, 2, 666], [3, 4, 666]]
第二种:code
a = [[1,2], [3,4]] [_.append(666) for _ in a[:]] # 新增操做: 对整个列表切片自爆 print(a) >> [[1, 2, 666], [3, 4, 666]]
第三种:入门
a = [[1,2], [3,4]] [_.append(666) for _ in copy.copy(a)] # 新增操做: 对整个列表使用浅拷贝API print(a) >> [[1, 2, 666], [3, 4, 666]]
第四种:import
a = [[1,2], [3,4]] [_.append(666) for _ in copy.deepcopy(a)] # 新增操做: 整个列表使用深拷贝API print(a) >> [[1, 2], [3, 4]]
第五种:(注意 和 第二种 对比)容器
a = [[1,2], [3,4]] [_[:].append(666) for _ in a] # 新增操做:对即将操做的子列表切片自爆 print(a) >> [[1, 2], [3, 4]]
第六种:(注意 和 第三种 对比)基础
a = [[1,2], [3,4]] [copy.copy(_).append(666) for _ in a] # 新增操做:对即将操做的子列表 使用浅拷贝API print(a) >> [[1, 2], [3, 4]]
多级容器需谨慎 (虽然多级 纯 元组是不可变类型,你想弄也弄不动它~~~)
可是这种状况,你仍是须要注意:im
a = ([1,2], [3,4]) # 里面的列表依然是可变的, 这算是刚入门的基础。但还应该留意
除了 deepcopy, 其余操做都是浅拷贝。
若是你喜欢使用 [::] , [:] 这种切片拷贝, 那么更应该注意一下上述案例问题。copy
也许你看上述代码很通常。甚至没有任何感受。
可是当你把子列表看成中间值(任意操做变换), 再提醒一次 ===> 做为 中间值(或者说临时值)使用时。
你的BUG可能在向你招手!co
import copy def f(sub): temp_list = [[]] for x in sub: for y in copy.deepcopy(temp_list): y.append(x) temp_list.append(y) return temp_list print(f(list(range(4))))