Python 中的淺拷貝和深拷貝
阿新 • • 發佈:2017-11-18
ont () ebe ans 深拷貝 函數 port epc com
1. 列表和字典,直接賦值,都是淺拷貝,即賦值雙方指向同一地址,因為 Python 對可變對象按引用傳遞。
>>> a = [1, 2, 3] >>> b = a >>> b [1, 2, 3] >>> a[0] = ‘apple‘ >>> a [‘apple‘, 2, 3] >>> b [‘apple‘, 2, 3] >>> >>> >>> dic = {‘a‘: ‘apple‘, ‘b‘: ‘banbana‘} >>> dic2 = dic >>> dic2 {‘a‘: ‘apple‘, ‘b‘: ‘banbana‘} >>> dic[‘b‘] = ‘blueberry‘ >>> dic {‘a‘: ‘apple‘, ‘b‘: ‘blueberry‘} >>> dic2 {‘a‘: ‘apple‘, ‘b‘: ‘blueberry‘}
2. 對非嵌套的列表,使用完全切片[:], 工廠函數 list(),或者 copy.copy() 都是深拷貝。
>>> a = [1, 2, 3]>>> b = list(a) >>> c = a[:] >>> import copy >>> d = copy.copy(a) >>> >>> a[0] = ‘apple‘ >>> a [‘apple‘, 2, 3] >>> b [1, 2, 3] >>> c [1, 2, 3] >>> d [1, 2, 3]
3. 對於非嵌套的字典,使用工廠函數 dict(),或者 copy.copy() 都是深拷貝。
>>> dic = {‘a‘: ‘apple‘, ‘b‘: ‘banana‘} >>> dic2 = dict(dic) >>> import copy >>> dic3 = copy.copy(dic) >>> >>> dic[‘b‘] = ‘blueberry‘ >>> dic {‘a‘: ‘apple‘, ‘b‘: ‘blueberry‘} >>> dic2 {‘a‘: ‘apple‘, ‘b‘: ‘banana‘} >>> dic3 {‘a‘: ‘apple‘, ‘b‘: ‘banana‘}
4. 對於嵌套的列表,嵌套的字典,只能使用 copy.deepcopy() 實現深拷貝。
>>> import copy >>> >>> a = [1, 2, [‘apple‘]] >>> b = copy.deepcopy(a) >>> a[2][0] = ‘watermelon‘ >>> a [1, 2, [‘watermelon‘]] >>> b [1, 2, [‘apple‘]] >>> >>> >>> dic = {‘a‘: ‘apple‘, ‘b‘: {‘b1‘: ‘banana‘, ‘b2‘: ‘blueberry‘}} >>> dic2 = copy.deepcopy(dic) >>> dic[‘b‘][‘b1‘] = ‘bukeneng‘ >>> dic {‘a‘: ‘apple‘, ‘b‘: {‘b1‘: ‘bukeneng‘, ‘b2‘: ‘blueberry‘}} >>> dic2 {‘a‘: ‘apple‘, ‘b‘: {‘b1‘: ‘banana‘, ‘b2‘: ‘blueberry‘}}
5. 對於嵌套可變對象的元組,只有 copy.deepcopy() 實現深拷貝。
>>> import copy
>>> >>> t = (1, 2, [‘apple‘]) >>> t2 = t >>> t3 = tuple(t) >>> t4 = copy.copy(t) >>> t5 = copy.deepcopy(t) >>> >>> t[2][0] = ‘watermelon‘ >>> t (1, 2, [‘watermelon‘]) >>> t2 (1, 2, [‘watermelon‘]) >>> t3 (1, 2, [‘watermelon‘]) >>> t4 (1, 2, [‘watermelon‘]) >>> t5 (1, 2, [‘apple‘])
完。
Python 中的淺拷貝和深拷貝