對于列表、元組和字典而言,進行賦值(=)、淺拷貝(copy)、深拷貝(deepcopy)而言,其內存地址是變化不通的。
賦值只是創建一個變量,該變量指向原來的內存地址
>>> name1 = ['a','b',['m','n'],'c']>>> name2 = name1#輸出結果,兩個內存地址是一樣的>>> print(id(name1),',',id(name2))50077256 , 50077256
如圖所示:
淺拷貝是指在內存地址中,只拷貝出第一層的內存的地址,所以拷貝變量和被拷貝變量的內存地址是不一樣的(列表、元組和字典中的copy()方法都是淺拷貝)
>>> import copy>>> name1 = ['a','b',['m','n'],'c']#淺copy>>> name2 = copy.copy(name1)>>> print(name1,',',id(name1))['a', 'b', ['m', 'n'], 'c'] , 50228296>>> print(name2,',',id(name2))['a', 'b', ['m', 'n'], 'c'] , 50920008#修改列表中的元素>>> name1[0] = 'h'>>> name1[2][0] = 'M'>>> print(name1,',',id(name1))['h', 'b', ['M', 'n'], 'c'] , 50228296>>> print(name2,',',id(name2))['a', 'b', ['M', 'n'], 'c'] , 50920008
如圖所示:
注:因為淺拷貝只拷貝了第一層,所以拷貝的變量和被拷貝的變量的第二層的列表的內存地址是一樣的。
>>> import copy>>> name1 = ['a','b',['m','n'],'c']>>> name2 = copy.copy(name1)>>> name1[0] = 'h'>>> name1[2][0] = 'M'#name1[2][0]的內存地址和name2[2][0]內存地址是一樣的>>> print(name1,id(name1),id(name1[2][0]))['h', 'b', ['M', 'n'], 'c'] 50209800 13820904>>> print(name2,id(name2),id(name2[2][0]))['a', 'b', ['M', 'n'], 'c'] 50891144 13820904
1.用copy模塊中的copy方法(跟上面的一樣)
2.用切片的方式:
>>> name1 = ['a','b',['m','n'],'c']>>> name2 = name1[:]
3.用列表自帶的方法:
>>> name1 = ['a','b',['m','n'],'c']>>> name2 = name1.copy()
深拷貝是指在內存中將所有的數據重新創建一份。
注:排除最后一層,即python內部對字符串和數字的優化
>>> import copy>>> name1 = ['a','b',['m','n'],'c']#深拷貝>>> name2 = copy.deepcopy(name1)>>> print(name1,',',id(name1))['a', 'b', ['m', 'n'], 'c'] , 50142472>>> print(name2,',',id(name2))['a', 'b', ['m', 'n'], 'c'] , 50942280>>> name1[0] = 'h'>>> name1[2][0] = 'M'>>> print(name1,id(name1),id(name1[2][0]))['h', 'b', ['M', 'n'], 'c'] 50142472 10937320>>> print(name2,id(name2),id(name2[2][0]))['a', 'b', ['m', 'n'], 'c'] 50942280 4896280
新聞熱點
疑難解答