Python直接赋值、浅拷贝和深拷贝以及切片
参考
https://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
1. 直接赋值
直接赋值: b = a
, a 和 b 都指向同一个对象,则若改变a或b,另一个变量的值会跟着改变。
直接赋值:其实就是对象的引用(别名)。
例:
1.1 列表赋值实例
1 | 1,2,3] a = [ |
👆 改变a -> b会跟着变;改变b -> a会跟着变
1.2 字典赋值实例
1 | 1:[1,2,3]} a = { |
👆 改变a -> b会跟着变;改变b -> a会跟着变
2. 浅拷贝
浅拷贝: b = a.copy()
,a 和 b
是一个独立的对象,但他们的子对象还是指向同一对象(是引用)。浅拷贝拷贝父对象,改变其中一个,另一个不会变,但如果a中还有子对象,则改变子对象中的内容,另一个的子对象中的内容会跟着变
(见下面示例)。
浅拷贝(copy):拷贝父对象,不会拷贝对象内部的子对象。(即拷贝了父对象,现在改变父对象的话,不会影响到另一个变量的值,但由于子对象没有被拷贝,改变一个变量的子对象的值会影响另一个变量的值)
例:
2.1 列表浅拷贝实例
1 | 1,2,3] a = [ |
👆 改变a -> b不会跟着变;改变b -> a不会跟着变
2.2 字典浅拷贝实例
1 | 1:[1,2,3]} a = { |
👆 改变子对象内容时:改变a -> b会跟着变;改变b -> a会跟着变
1 | 2] = [2,2,2] a[ |
👆 改变父对象内容时:改变a -> b不会跟着变;改变b -> a不会跟着变
3. 深拷贝
深度拷贝:b = copy.deepcopy(a)
,a 和 b
完全拷贝了父对象及其子对象,两者是完全独立的。无论改变a中的任何内容,b中都没有影响,反之亦然。
深拷贝(deepcopy):copy模块的deepcopy方法,完全拷贝了父对象及其子对象。
例:
2.1 列表深拷贝实例
1 | import copy |
👆 改变a -> b不会跟着变;改变b -> a不会跟着变
2.2 字典深拷贝实例
1 | import copy |
👆 改变子对象内容时:改变a -> b不会跟着变;改变b -> a不会跟着变
1 | 2] = [2,2,2] a[ |
👆 改变父对象内容时:改变a -> b不会跟着变;改变b -> a不会跟着变
4. 更多实例
1 | import copy |
输出结果为:
1 | a = [1, 2, 3, 4, ['a', 'b', 'c'], 5] |
5. 切片操作
Python切片操作可作用于 list(包括 tuple, string)
切片操作相当于浅拷贝
例:
1 | a = [1,2,[3]] |
输出结果为:
1 | a = [1, 2, [3, 4], 5] |