1. 程式人生 > >python學習筆記2:“=”的真正含義——引用

python學習筆記2:“=”的真正含義——引用

一、不同情況下b=a後的分析

例項1:不可變物件賦值

a=3
b=a
a=4
a
b

例項2:可變物件賦值例項
a=[1,2,3]
b=a
a[0]=99
a
b

例項3:可變物件賦值例項
a=[1,2,3]
b=a
a=[99,2,3]
a
b

例項4:直接賦值例項
a=[1,2,3]
b=[1,2,3]
a[0]=99
a
b

大多數時候,我們可能只是想給a、b初始化相同的值,才用了b=a,在使用中,我們並不希望a修改後對b造成影響,或者修改b後,對a造成影響。

但從例項1和2看,b=a,有可能互不影響,有可能會相互影響,要視a的具體值的情況。我們應當如何理解這種情況,以至不會因為理解上的模糊不清,影響我們實際程式設計呢?
1.b=a,實際是將a指向的物件的引用賦值給b,這樣a和b就指向了同一個物件
2.執行a=4(例項1),實際上是新建立一個物件4,再將4的引用賦值給a;
 再執行a=[99,2,3](例項3),實際上是新建立一個物件[99,2,3],再將[99,2,3]的引用賦值給a;
 這兩種情況自然都不會影響到b的值,因為b的引用的物件本身並沒有發生變化
3.執行a[0]=99(例項2),修改的是物件[1,2,3]第一個元素的值,a和b所指向的還是這個物件,物件本身變化了,所以a和b變數看到的值也就都變化了
4.執行a[0]=99(例項4),a和b本身指向的都是不同物件,自然修改a不會影響b。(不論出於什麼因素,如果4中修改a後b也變了,那這種語言肯定也沒必要學了,語言自己都混亂了,用它程式設計豈不更混亂)
從以上分析我們可以知道,b=a後,a、b是否會相互影響,關鍵在於修改的是不是物件本身的內容。如果修改的是物件本身的內容,則兩者會相互影響;如果是建立新物件後直接賦值給上述某個變數,則兩者不會相互影響



二、附上上述提到的兩個概念(用於區分是否是修改物件本身的內容)

1.可變物件:
標準定義:如果物件的值是可以修改的,則稱該物件為可變物件
包含:自定義型別、列表(list)、字典(dict)、可變集合(set)
特徵:執行類似a=[1,2,3]後,再執行a[0]=99,實際上是這個物件第一個元素的值改為99;當然,如果是執行a=[1,2,3]後,再執行a=[99,2,3],就是新建物件[99,2,3]後賦值給變數a

2.不變物件:
標準定義:如果物件的值不可以修改,則稱為不可變物件
包含:數字型別(int、long、float、complex、bool)、字串型別(str、unicode)、元組(tuple)、不可變集合(frozenset)
特徵:執行類似a=3後,再執行a=4,實際上不是將3這個物件所在的記憶體的值改為4,而是在記憶體中新建一個物件4,再賦值給變數a