|
发表于 2018-7-30 12:58:45
|
显示全部楼层
回帖奖励 +1 鱼币
我又去看看相关的资料
发现和楼主所说的不一样
进行了相应的尝试
>>> list1 = [1,2,3]
>>> list2 = list1.copy()
>>> list1[0] = 0
>>> print(list1)
[0, 2, 3]
>>> print(list2)
[1, 2, 3]
也可以使用内置函数 id() ,发现 list1和 list2 指向内存中同一个对象
>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1.copy()
>>> list1[0][0] = 5
>>> print(list1)
[[5, 2], 3, '清明']
>>> print(list2)
[[5, 2], 3, '清明']
>>> list1.append(10)
>>> print(list1)
[[5, 2], 3, '清明', 10]
>>> print(list2)
[[5, 2], 3, '清明']
>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1[:]
>>> list1[0][0] = "蝶恋花"
>>> print(list1)
[['蝶恋花', 2], 3, '清明']
>>> print(list2)
[['蝶恋花', 2], 3, '清明']
>>> list1 = [[1, 2,], 3, '清明']
>>> list2 = list1[:]
>>> list1[0][0] = "对父对象的子对象进行更改"
>>> print(list1)
[['对父对象的子对象进行更改', 2], 3, '清明']
>>> print(list2)
[['对父对象的子对象进行更改', 2], 3, '清明']
>>> list1.append("对父对象进行更改")
>>> print(list1)
[['对父对象的子对象进行更改', 2], 3, '清明', '对父对象进行更改']
>>> print(list2)
[['对父对象的子对象进行更改', 2], 3, '清明']
赋值不是浅拷贝。
赋值:对象的引用(别名)。用一个变量给另一个变量赋值,其实就是给当前内存中的对象增加一个“标签”而已。对象赋值实际上是对象的引用。当创建一个变量,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用。
浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。如果原始对象的父对象改变,而子对象不变,拷贝得到的父对象不会跟着改变;如果原始对象的父对象里的子对象改变,则拷贝得到的父对象的字对象也会跟着改变。(浅拷贝:拷贝组合对象,不拷贝子对象)
常见的浅拷贝有:切片操作(mylist2 =mylist1[:])、工厂函数、对象的copy()方法(mylist2 =mylist1.copy())、copy模块中的copy函数
深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。原始对象的改变不会造成深拷贝里任何子元素的改变
有的地方我也表述的不是很到位。 |
|