【python記憶體機制】引用和賦值
阿新 • • 發佈:2018-11-30
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