1. 程式人生 > >Python的基礎語法 13 深拷貝與淺拷貝

Python的基礎語法 13 深拷貝與淺拷貝

python中的深copy和淺copy
bytes

Python bytes/str
bytes 在Python3中作為一種單獨的資料型別,不能拼接,不能拼接,不能拼接

>>> '€20'.encode('utf-8')
b'\xe2\x82\xac20'
>>> b'\xe2\x82\xac20'.decode('utf-8')
'€20'
解碼

>>> b'\xa420'.decode('windows-1255')
'?20'
**深copy和淺copy**
深copy新建一個物件重新分配記憶體地址,複製物件內容。淺copy不重新分配記憶體地址,內容指向之前的記憶體地址。淺copy如果物件中有引用其他的物件,如果對這個子物件進行修改,子物件的內容就會發生更改。

import copy

#這裡有子物件
numbers=['1','2','3',['4','5']]
#淺copy
num1=copy.copy(numbers)
#深copy
num2=copy.deepcopy(numbers)

#直接對物件內容進行修改
num1.append('6')

#這裡可以看到內容地址發生了偏移,增加了偏移‘6’的地址
print('numbers:',numbers)
print('numbers memory address:',id(numbers))
print('numbers[3] memory address',id(numbers[3]))
print('num1:',num1)
print('num1 memory address:',id(num1))
print('num1[3] memory address',id(num1[3]))


num1[3].append('6')

print('numbers:',numbers)
print('num1:',num1)
print('num2',num2)

輸出:
numbers: ['1', '2', '3', ['4', '5']]
numbers memory address: 1556526434888
numbers memory address 1556526434952
num1: ['1', '2', '3', ['4', '5'], '6']
num1 memory address: 1556526454728
num1[3] memory address 1556526434952
numbers: ['1', '2', '3', ['4', '5', '6']]
num1: ['1', '2', '3', ['4', '5', '6'], '6']
num2 ['1', '2', '3', ['4', '5']]


不可變物件:建立以後就不能修改的物件,例如整形,字串,元組。

可變物件:建立以後可以修改,例如:列表,字典,集合。

變數:系統的元素,擁有指向物件的連線空間

引用:自動生成的,從變數到物件的指標。

物件:系統分配的一塊記憶體空間 可以儲存自身的資料


深淺拷貝:
	不可變物件沒有深淺拷貝這一說
	可變物件才能談上深拷貝與淺拷貝
eg:>>> a=[[1,2,3],2,0]
    >>> b=a
    >>> c=a[:]
    >>> import copy
    >>> d=copy.copy(a)
    >>> id(a)
    1538577742152
    >>> id(b)
    1538577742152
    >>> id(c)
    1538620860744
    >>> id(d)
    1538621694536
	淺拷貝的方式:
		import copy
		形式1:
		a=[1,2,3,4,5]
		b=copy.copy(a)
		形式2:
		a=[1,2,3,4,5]
		c=a[:]
		

        深拷貝的方式:
		import copy
		a=[[1,2,3],2,3]
		b=copy.deepcopy(a)
	
	深淺拷貝的意義:
		淺拷貝:節省記憶體空間
		深拷貝:資料的儲存有保障