1 引用和對象
1.1> 建立變量的過程
內存建立對象 --> 建立變量 --> 變量引用到對象
所以:變量只是到內存對象的一個引用
1.2> 對象組成
類型標識符(標識對象類型)
引用計數(是否回收對象)
1.3> 垃圾回收
若是對象沒有變量引用(引用計數爲0),那麼會被回收
1.4> 共享引用:多個變量引用同一個對象
a = 1
b = a // a和b指向的是內存中同一對象
a = 3
b = a
a = 4 // 改變a的值,不會影響a的值(只是單純的改變引用指向)
1.5> 共享引用和原處修改 // 主要關注的是可變對象共享引用,須要引入拷貝(深淺拷貝的id都不一樣)
*場景1* // list只有一層
l1 = [1,2,3]
l2 = l1
l2[0] = 2 // 此處l1和l2都會改變
*解決方案*
l2 =l1[:] // 淺拷貝 copy.cpoy()也可實現
l2[0] = 2 // 此處修改l2不會影響l1
*場景2* // list有多層
l1 = [1,2,[1,2]]
l2 = l1[:]
l2[2][0] = 2 // 此處l2即便拷貝(淺拷貝),l1也會被影響
*解決方案*
l2 = copy.deepcopy(l1)
1.6> 共享引用和相等
// 先導:python對象包含3個要素 id(身份標識) value(值) type(對象類型)
// == 判斷的是value值 is判斷的是id標識
s1 = 1
s2 = 1
s1 is s2 ==> True
s1 == s2 ==> True // 小範圍整數(-127~256),python不會建立新的對象,1會被a和b複用
s1 = ‘spam’
s2 = 'spam'
s1 is s2 ==> True
s1 == s2 ==> True // 字符串相似於小整數
s1 = [1,2,3]
s2 = [1,2,3]
s1 == s2 ==> True
s1 is s2 ==> False // 對於list、tuple、dict、set時,s1 is s2均爲False