Python 浅拷贝 深拷贝
深拷贝:a -> b copy(a) a -> c content(b) = content(c) && id(b) != id(c)浅拷贝:a -> b copy(a) a -> b
也就是说深拷贝为新对象制定了独立的新拷贝,逻辑不相关,而只是内容相同,而浅拷贝只是简单的复制引用关系。
引用时不可改变的指针,指针是可改变的引用。
person = ['name',['Saving',100.0]]
hubby = person[:]
#wife = list
print 'before',
print person , hubby
print '====================================='
hubby = 'joe'
hubby = 50
print 'after',
print person , hubby
运行结果:
before ['name', ['Saving', 100.0]] ['name', ['Saving', 100.0]]
=====================================
after ['name', ['Saving', 50]] ['joe', ['Saving', 50]]
惊讶发现,hubby的那么改变没有导致person的那么改变,而列表则发生改变。为什么?
因为String是不可变对象,在复制的时候会创建新的变量(红色所示)而list则是可改变对象,复制直接复制引用(浅拷贝)。
如果采用hubby = copy.deepcopy(person),则变成深拷贝。
1. 非容器类型(比如数字,字符串和其他"原子"类型的对象,像代码,类型和 xrange 对象等)没有被拷贝一说
2. 如果元组变量只包含原子类型对象,对它的深拷贝将不会进行,即使深拷贝也只得到一个浅拷贝
3. 浅拷贝是用完全切片操作来完成的
页:
[1]