1. 程式人生 > >Python中“i+=i與i=i+i”的區別梳理:(引用、記憶體、可變引數、不可變引數)

Python中“i+=i與i=i+i”的區別梳理:(引用、記憶體、可變引數、不可變引數)

Python中“i+=i與i=i+i”的區別梳理

一、 "i+=i"執行時資料記憶體的變化

num+=num執行時,num原引用的記憶體空間中,根據空間中儲存的引數的資料型別是否為可變型別而進行變化,***可變的引數資料型別***有:列表、字典;***不可變引數的型別***有:數字、字串、元組。

#程式碼1
a=100
def test(num):
    num+=num
    print("in----test----  num="+str(num))

test(a)
print(a)

當a=100時,100為不可變型別,因此當函式中的num指向100並需要發生改變時, num中的100無法直接改變,因此函式test中的第一個num實質上是一個區域性變數, 每一次都指向一個新的“和值”對應的記憶體空間,因此輸出結果為num:200,a:100, 全域性變數a的值未發生變化。

#程式碼2
a=[100]
def test(num):
    num+=num
    print("in----test----  num="+str(num))

test(a)
print(a)

當a=[100]時,a指向一個型別為可變型別的記憶體空間,因此當sum+=sum執行時, 該記憶體空間中的值發生了變化,列表內容進行了合併,a的引用不發生改變, 輸出結果為num:[100,100],a:[100,100],可以看出全域性變數a的值也發生了變化。

因此在使用函式對全域性變數進行計算時,應當注意全域性變數是否為可變型別。

二、"i=i+i"執行時資料記憶體的變化

num=num+num執行時,num指向一個記錄了原記憶體空間中的數值通過表示式計算所得的結果

新的記憶體空間。

#程式碼3
a=[100]
def test(num):
    num=num+num
    print("in----test----  num="+str(num))

test(a)  #[100,100]
print(a) #[100]

因此在函式執行結束後,即便全域性變數為可變引數的型別,全域性變數a所引用的記憶體空間中的值並沒有發生改變。