#浅拷贝在内存中只额外建立第一层数据 import copy D = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]} n2 = copy.copy(D) # 拷贝方式一 n2 = dict(D) # 拷贝方式二 # 对于列表来讲还有以下几种拷贝方式 L = [1, 2, [2, 3]] n2 = L[:] n2 = list[L] n3 = [x for x in L] #经过列表推倒式建立
在使用浅拷贝时,对象内部的属性和内容仍然引用原始对象,这样的操做速度很快,并且节省内存。python
#在内存中将全部的数据建立一份(最后一层数据除外,这是由python内部对字符串和数字类型的优化致使的) import copy n1 = {'k1': 'he', 'k2': 123, 'k3': ['morra', 456]} n2 = copy.deepcopy(n1)
若是须要拷贝一些容器对象,还必须递归地拷贝其内部引用的对象。这种深拷贝操做会消耗至关的时间和内存。函数
def func(b): b = 'spam' a = 3 func(a) print(a) # 结果是3
以上的参数传递过程可简化为一下步骤:优化
a = 3 b = a b = 'spam'
多个变量名引用了同一引用,也叫作"共享引用":spa
b = 'spam' #这个赋值运算改变的不是对象3,只是改变了变量a,而变量b并无发生变化,因此上面的运行结果是3code
因此咱们通常说,str、int等不可变(immutable)对象的传递方式为值传递。对象
引用传递就很好理解了:blog
def func(b): b[0] = 'spam' a = [3] func(a) print(a) # 结果是['spam']
对于list、dict这些书可变(mutable)对象而言,因为变量引用的是“对底层不可变数据的引用”,因此这些对象的传递方式每每是引用传递。递归