20201225-2 列表的使用2
1 copy 相当于复制一个列表 names = ["4ZhangYang","#!Guyun","xXiangPeng","ChenRonghua","XuLiangChen"] name2 = names.copy() print(names) print(name2)
--->
['4ZhangYang', '#!Guyun', 'xXiangPeng', 'ChenRonghua', 'XuLiangChen']
['4ZhangYang', '#!Guyun', 'xXiangPeng', 'ChenRonghua', 'XuLiangChen']
1-1 现在把 XiangPeng 改成中文 names[2] = "向鹏" print(names) print(name2) name2 变了吗? 没有变 ---> ['4ZhangYang', '#!Guyun', '向鹏', 'ChenRonghua', 'XuLiangChen'] ---> ['4ZhangYang', '#!Guyun', 'xXiangPeng', 'ChenRonghua', 'XuLiangChen']
1-2 列表中可以继续写列表,形成子列表,现在希望将 alex 大写 names = ["4ZhangYang","#!Guyun","xXiangPeng",["alex","jack"],"ChenRonghua","XuLiangChen"] name2 = names.copy() 子列表 ["alex","jack"] 可以当做一个元素 names[2] = "向鹏" names[3][0] = "ALEXANDER" print(names) print(name2) ---> ['4ZhangYang', '#!Guyun', '向鹏', ['ALEXANDER', 'jack'], 'ChenRonghua', 'XuLiangChen'] ---> ['4ZhangYang', '#!Guyun', 'xXiangPeng', ['ALEXANDER', 'jack'], 'ChenRonghua', 'XuLiangChen'] name2中 没有 向鹏 但是 ALEXANDER 在 names 和 name2 中 都修改了 这个 copy 好像只是 copy 了 第一层,没错,这个 copy 叫做 浅拷贝,只拷贝 第一层 子列表是一个独立的内存指针,是大列表中的一个内存地址;copy其实是 拷贝了 内存地址 所以 ALEXANDER 也变了
2 如果想深拷贝怎么办?列表是一种不同于 数字 和字符串的 数据类型 >>> a=1 >>> b=a >>> a=2 >>> b 1 但是,如果换成列表 >>> a=[1,2,3] >>> b=a >>> a[1]=555 >>> b [1, 555, 3]
可以 用 import copy 的方式 import copy names = ["4ZhangYang","#!Guyun","xXiangPeng",["alex","jack"],"ChenRonghua","XuLiangChen"] name2 = copy.copy(names) names[2] = "向鹏" names[3][0] = "ALEXANDER" print(names) print(name2) ---> ['4ZhangYang', '#!Guyun', '向鹏', ['ALEXANDER', 'jack'], 'ChenRonghua', 'XuLiangChen'] ---> ['4ZhangYang', '#!Guyun', 'xXiangPeng', ['ALEXANDER', 'jack'], 'ChenRonghua', 'XuLiangChen'] 这个和 列表中的 copy 是完全一样的
必须手动的写 深拷贝 name2 = copy.deepcopy(names) ---> ['4ZhangYang', '#!Guyun', '向鹏', ['ALEXANDER', 'jack'], 'ChenRonghua', 'XuLiangChen'] ---> ['4ZhangYang', '#!Guyun', 'xXiangPeng', ['alex', 'jack'], 'ChenRonghua', 'XuLiangChen'] 这时,完全独立了,这就是 深拷贝 和 浅拷贝 深拷贝需求量不大,深拷贝会占用两个独立空间
3 如果想做列表的循环 3-1 for i in names: print(i) ---> 4ZhangYang #!Guyun xXiangPeng ['alex', 'jack'] ChenRonghua XuLiangChen 3-2 有步长的切片 names = ["4ZhangYang","#!Guyun","xXiangPeng",["alex","jack"],"ChenRonghua","XuLiangChen"] print(names[0:-1:2]) ---> ['4ZhangYang', 'xXiangPeng', 'ChenRonghua'] 0 可以省略,变为 print(names[::2]) 如果去掉步长,print(names[:]) 代表 0 到 -1