1. 程式人生 > >【python內存機制】引用和賦值

【python內存機制】引用和賦值

引用 需要 指向 相等 lse 字符 場景 整數 計數

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

【python內存機制】引用和賦值