python标准库的copy模块提供了两个函数来创建拷贝。第一个常用的函数式copy,它会返回一个具有同样的内容和属性的对象。
import copy new_list=copy.copy(list)
某些特殊的时候,你可能会需要对象中的属性和内容被分别递归的拷贝,这个时候可以使用deepcopy
import copy new_list=copy.deepcopy(list)
当给一个对象赋值(或者将其作为参数传递,或者作为结果返回),python和java一样使用一个指向原对象的引用,并不是真正的拷贝。python从来不为赋值操作进行‘隐士’拷贝:要得到一个拷贝,必须明确的要求,需要的是拷贝。
a=[1,2,3,4] b=a b.append(5) print(a) print(b) print(a is b)
#[1, 2, 3, 4, 5] #[1, 2, 3, 4, 5] #True 这里,名字a和b都引用到同样的对象列表a,所以无论我们通过哪个名字修改了对象的内容,修改的结果都是一样的,这个过程过程中并没有一个原始的未被修改的拷贝。
提示: 要成为一个好的python,必须了解修改对象和将对象赋值给变量的区别,赋值使用的是引用。这两种操作相互之间并没有什么关联。类似a=[]这种语句,是对a做了重新绑定,但却不会影响原来绑定到的a对象。因此,这里完全没有引用和拷贝的问题:只有当需要修改某些对象的时候,引用和拷贝才有可能成为问题。
如果想修改一个对象,但又不需要改动原对象,必须做一个拷贝。