python直接賦值、深拷貝和淺拷貝
阿新 • • 發佈:2018-11-23
python中,物件賦值實際上是物件的引用。當建立一個物件,將其賦值給另一個變數,python並沒有拷貝這個物件,而是拷貝了這個物件的引用。 所以如果從單純的賦值語句來實現clone物件的話, 那可能bug出現的也會莫名其妙. Python中可以使用copy模組來複制物件.
copy.copy 為淺拷貝, 只copy父物件, 不會拷貝物件內部的子物件。
淺拷貝copy.deepcopy 深拷貝, 拷貝物件及其子物件。
>>> import copy >>> a = [1,2,3,4,['a','b']] >>> b = a # 賦值拷貝 >>> c = copy.copy(a) # 淺拷貝, 只拷貝了a的引用, 內部元素沒有拷貝. >>> d = copy.deepcopy(a) # 深拷貝, 完全拷貝 >>> >>> a.append(5) >>> a[4].append('c') >>> >>> print 'a=',a a= [1, 2, 3, 4, ['a', 'b', 'c'], 5] >>> print 'b=',b b= [1, 2, 3, 4, ['a', 'b', 'c'], 5] #賦值拷貝, 記憶體地址指向一樣的。 相當於一個人的兩個名字而已. >>> print 'c=',c c= [1, 2, 3, 4, ['a', 'b', 'c']] #淺拷貝, 子元素c[4]引用的地址和a[4]是一樣的. 所以改變a[4]相當於改了c[4]. >>> print 'd=',d d= [1, 2, 3, 4, ['a', 'b']] #深拷貝完全拷貝. a和d完全改變了.