目录python
在python中,对象赋值其实是对象的引用。当建立一个对象,而后把他赋值给另一个变量的时候,python并无拷贝这个对象,而是拷贝了这个对象的引用。app
针对列表l1=['a','b','c',['d','e','f']]
通常有三种方法,分别为:拷贝(赋值)、浅拷贝、深拷贝。code
注意:==拷贝、浅拷贝、深拷贝都是针对可变类型数据而言的==对象
id 不变值可变,即在原理的基础上修改,则为可变数据类型;值变id也变,即重新申请一个空间放入新值,则为不可变的数据类型。blog
age = 19 print('first:',id(age)) age = 20 print('second:',id(age)) #输出: first: 140731004973888 second: 140731004973920
x = 10 y = 20 print('x:', id(x), 'y', id(y)) x, y = y, x print('x:', id(x), 'y', id(y)) #输出: x: 140731004973600 y 140731004973920 x: 140731004973920 y 140731004973600
若是l2是l1的拷贝对象,则l1内部的任何数据类型的元素变化,则l2内部的元素也会跟着变化,由于可变类型值变id不变。it
l1 = ['a','b','c',['d','e','f']] l2 = l1 l1.append('g') print(l1) #输出: ['a', 'b', 'c', ['d', 'e', 'f'], 'g'] print(l2) #输出 : ['a', 'b', 'c', ['d', 'e', 'f'], 'g']
若是l2是l1的浅拷贝对象,则l1内的不可变元素发生了改变,l2不变。若是l1内的可变元素发生l改变,则l2会跟着改变。class
import copy l1 = ['a','b','c',['d','e','f']] l2 = copy.copy(l1) l1.append('g') print(l1) #输出: ['a', 'b', 'c', ['d', 'e', 'f'], 'g'] print(l2) #输出: ['a', 'b', 'c', ['d', 'e', 'f']] l1[3].append('g') print(l1) #输出: ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g'] print(l2) #输出: ['a', 'b', 'c', ['d', 'e', 'f', 'g']]
若是l2 是l1 的深拷贝对象,则l1内的不可变元素发生了改变,l2不变。import
若是l1内的可变元素发生了改变,l2也不会改变,即l2 是永远不会由于l1 的变化而变化的。基础
import copy l1 = ['a','b','c',['d','e','f']] l2 = copy.deepcopy(l1) l1.append('g') print(l1) #输出: ['a', 'b', 'c', ['d', 'e', 'f'], 'g'] print(l2) #输出: ['a', 'b', 'c', ['d', 'e', 'f']] l1[3].append('g') print(l1) #输出: ['a', 'b', 'c', ['d', 'e', 'f', 'g'], 'g'] print(l2) #输出: ['a', 'b', 'c', ['d', 'e', 'f']]