ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
* 作者:煮酒品茶 tea * 博客:http://www.zwhset.com http://cwtea.blog.51cto.com * 目前在京峰教育担任python讲师 #0、知识介绍 * 原处修改(可变类型):python有些对象支持原处修改,即为对象内存本身可以进行增册改查等操作,而不改变内存地址(id号)。 * 常见可变类型:list dict * 常见不可变类型:int str tuple * 所以可变类型支持原处修改,而不可变类型不支持原处修改(id)号 * 拷贝: **需要理解框子概念** > 列表只是一个框子,里面装的水果(元素)只是一个个的内存引用地址(id)号,同样框子里面装的框子(嵌套列表)里面也只是一个引用地址,列表维护本身位置索引的关系。 a = [1,2,[3]] --> [] 1 2 [] 3具有如下几个引用地址 a维护[]的位置索引信息。 * 浅拷贝:对可变类型外层(顶层)数据进行拷贝,产生变化的是对象[]本身,[]内不可变类型id不变,[]内可变类型引用地址不变。所以只复制了[]本身。 * 深拷贝:对可变类型外层以及内层数据进行拷贝,实则不可变类型拷贝内存地址,可变类型新建内存地址。 #1、赋值引用 ~~~ In [23]: a = [] In [24]: b = a # 赋值,实则为引用a对象的内存地址 In [25]: a.append(2) # 添加2元素到列表末尾 In [26]: a,b Out[26]: ([2], [2]) #a b列表都有进行元素添加 ~~~ #2、原处修改常见错误 ~~~ In [1]: a = [1,2] In [2]: #新手易对本地原处修改进行重复赋值 In [3]: a = a.append(3) #想在[1,2]后面增加一个3并赋值给a In [4]: a # None a的原始结果都没有了 ~~~ #3、浅拷贝 ~~~ In [7]: a = [1,[2,3]] # 嵌套列表 In [8]: b = a[:] # b为a的浅拷贝 In [9]: a.append(4) # a添加4的元素,由于拷贝b并未添加 In [10]: a Out[10]: [1, [2, 3], 4] In [11]: b Out[11]: [1, [2, 3]] ~~~ #4、浅拷贝内层可变列表还是引用 ~~~ In [12]: a[1].append(5) # 对内层列表进行添加5的元素 In [13]: a # 列表a添加了,b也添加了 # a b内层列表值一样 Out[13]: [1, [2, 3, 5], 4] In [14]: b Out[14]: [1, [2, 3, 5]] ~~~ #5、深拷贝 ~~~ In [15]: import copy #引用拷贝模块 In [16]: c = copy.deepcopy(a) In [17]: a Out[17]: [1, [2, 3, 5], 4] In [19]: c Out[19]: [1, [2, 3, 5], 4] In [20]: a[1].append(6) # 内层列表添加元素6 # a c值已经不同 In [21]: a Out[21]: [1, [2, 3, 5, 6], 4] In [22]: c Out[22]: [1, [2, 3, 5], 4] ~~~ #6、例子问题 ~~~ lists = [1,2,3] def for_list(lists): for iter in lists: # do something ~~~ **for_list(lists=lists) 还是for_list(lists=lists)进行浅拷贝呢?**