【python記憶體機制】引用和賦值

  • 2020 年 1 月 14 日
  • 筆記

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