Python中對列表的可變性進行討論

2021-07-15 12:59:54 字數 1775 閱讀 6208



在python中,一切皆物件,對於物件中的數字,字串,元組,其是不可變的物件。而對於列表是可變的物件。

可變與不可變性,是對記憶體位址而言的。由於python是解釋性語言,因而對於每個物件的賦值都是對記憶體塊的引用,例如 a=2,此時a是2的引用,若這是你修改a=2的表示式,改為a=3,此時a就指向了3這個記憶體塊。

具體程式如下所示:

a = 2

print id(a)

a = 3

print id(a)

輸出結果:

31095184

31095160

以上說明,a賦值不同的變數,只是引用不同的記憶體,不能對記憶體進行修改。這體現了不可變性。

對於元組而言,也是屬於不可變性,乙個元組儲存在同一塊記憶體中,屬於不可變。

具體**如下所示:

print('research on the variability of tuple ')

tuple1 = ("juan", 24, "110")

print tuple1

tuple1[1] = 25

print tuple1

輸出結果:

typeerror: 'tuple' object does not support item assignment
以上說明不能對tuple1中的某個元素進行修改。

對於列表而言,其屬於是可變性。具體理解可以根據c語言中的鍊錶模擬,對於列表,首位址是不可變的,而對於列表內的所有元素進行修改,會改變單個元素的位址(指向不同的引用)。所以說對於列表中的單個元素而言是不可變的,對於整體列表而言是可變的,如下圖所示:

列表操作**如下所示:

print('research on the variability of lists') 

list1 = ["juan", 24, "110"]

print list1

print "id-list1=", id(list1)

print "id-list1[0]=", id(list1[0])

print "id-list1[1]=", id(list1[1])

list1[0] = "tao"

list1[1] = 26

print list1

print "id-list1=", id(list1)

print "id-list1[0]=", id(list1[0])

print "id-list1[1]=", id(list1[1])

輸出結果:

research on the variability of lists

['juan', 24, '110']

id-list1= 38301128

id-list1[0]= 38951672

id-list1[1]= 31094656

['tao', 26, '110']

id-list1= 38301128

id-list1[0]= 38951872

id-list1[1]= 31094608

以上只是對這種現象的一種假想,沒能進行原始碼的驗證,若有錯誤,希望給予指正。

關於不可變性與可變性的「巢狀」聯想

先給出定義 先申述乙個概念 變數 引用 值 也就是 該變數初始化的記憶體 可變性與不可變性 引用可變與否,值可變與否。值的可變性取決於 值的型別是否是可變的,這取決於建立該值的類是否可變。而引用的可變性取決於 該變數命名時是否字首有 final 那麼對於乙個物件而言,其不可變性的程度 是什麼?乙個物...

可變性對迭代器的損害

在閱讀mit軟體構造的講義時,發現其中對可變性對迭代器的損害做出了介紹。並給出了乙個例項 如下 這裡方法的功能是刪去以 6.開頭的字串,但是發現結果與預期不同。分析 後發現好像並沒有什麼問題。自己復現一下 發現確實存在這個問題。其實,這並不是我們設計的myiterator帶來的bug。j a內建的a...

java可變性原則的封裝

可變性原則的封裝就是指將可變的元素封裝起來。abstract class person 不管男性女性都有走路的行為 public void run public void eat public abstract void method class man extends person 這是男性特有的...