theoforce 发表于 2017-4-30 15:45:53

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
print
print '====================================='
hubby = 'joe'
hubby = 50
print 'after',
print person , hubby
print
print

  运行结果:
  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]
查看完整版本: Python 浅拷贝 深拷贝