1. 程式人生 > 實用技巧 >【Python學習】可變型別和不可變型別

【Python學習】可變型別和不可變型別

一.可變型別與不可變型別的特點

1.不可變資料型別

不可變資料型別在第一次宣告賦值宣告的時候, 會在記憶體中開闢一塊空間, 用來存放這個變數被賦的值, 而這個變數實際上儲存的, 並不是被賦予的這個值, 而是存放這個值所在空間的記憶體地址, 通過這個地址, 變數就可以在記憶體中取出資料了. 所謂不可變就是說, 我們不能改變這個資料在記憶體中的值, 所以當我們改變這個變數的賦值時, 只是在記憶體中重新開闢了一塊空間, 將這一條新的資料存放在這一個新的記憶體地址裡, 而原來的那個變數就不在引用原資料的記憶體地址而轉為引用新資料的記憶體地址了.

舉例子:

>>> x = 18
>>> id(x)
4497811200
>>> id(18)
4497811200
>>> x = 19 
>>> id(x)
4497811232
>>> id(18)
4497811200
>>> y = 18
>>> id(y)
4497811200
>>> 

一開始x = 18,開闢一塊地址為4497811200的記憶體,即18對應的地址為4497811200,後來x = 19 ,重新開闢一塊地址為4497811232的記憶體來放19,可以看到不變的意思是指18,和19在記憶體中的地址不會改變,將18賦值給y時,y指向的地址即為4497811200。

1.可變資料型別

結合不可變資料型別,可變資料型別就很好理解來,可變資料型別是指變數所指向的記憶體地址處的值是可以被改變的。

>>> x = [1,2,3]
>>> id(x)
4501838920
>>> y = [1,2,3]
>>> z = [1,2,3]
>>> id(y)
4501838600
>>> id(z)
4501838664

從另外一個角度來看:

可變型別:當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址也會發生改變,對於這種資料型別,就稱不可變資料型別。

可變資料型別:當該資料型別的對應變數的值發生了改變,那麼它對應的記憶體地址不發生改變,對於這種資料型別,就稱可變資料型別。

#a的值改變了,a對應的記憶體地址也改變了
>>> a=1 >>> id(a) 4497810656 >>> a = 2 >>> id(2) 4497810688
#直接對a操作,相當於拷貝了一份a的值,在其他記憶體地址操作,a的值不變 >>> a+1 3 >>> id(a) 4497810688 >>> a 2
#b的值改變了,b對應的記憶體地址不變,第一次給b賦值的時候,給b劃分一塊記憶體空間,該空間就不變了 >>> b = [1,2,3] >>> id(b) 4501839496
#直接對b操作,b的值改變,b指向的記憶體空間不變 >>> b.append(4) >>> id(b) 4501839496 >>> b [1, 2, 3, 4] >>>

二.哪些是可變型別哪些是不可變型別

不可變:Number(數字)、String(字串)、Tuple(元組)。

#整型
a = 1
print(id(a), type(a))
a = 2
print(id(a), type(a))

# 4361254304 <class 'int'>
# 4361254336 <class 'int'>
#字串
b = 'anne'
print(id(b),type(b))
b = 'anne1995'
print(id(b),type(b))

# 4363638744 <class 'str'>
# 4363684784 <class 'str'>

#元組
c1 = ['1','2']
c = (1,2,c1)
print(c,id(c),type(c))
c1[1] = 'djx'
print(c,id(c),type(c))

# (1, 2, ['1', '2']) 4363948248 <class 'tuple'>
# (1, 2, ['1', 'djx']) 4363948248 <class 'tuple'>

注意:此時元組的值發生了變化而記憶體地址沒變,但我們依然稱元組為不可變型別,為什麼呢?其實改的是元組中的列表,列表是可變型別,改變了值後地址依然不變。但是元組的定義就是不可變的,

元組被稱為只讀列表,即資料可以被查詢,但不能被修改。

可以變:Set(集合)、List(列表)、Dictionary(字典)。

#集合
s = {1, 'd', '34', '1', 1}
print(s, type(s), id(s))
s.add('djx')
print(s, type(s), id(s))

# {1, '1', 'd', '34'} <class 'set'> 4401385256
# {1, '1', '34', 'd', 'djx'} <class 'set'> 4401385256



#列表
list = [1,'q','qwer',True]
print(list,type(list),id(list))
list.append('djx')
print(list,type(list),id(list))

# [1, 'q', 'qwer', True] <class 'list'> 4401113608
# [1, 'q', 'qwer', True, 'djx'] <class 'list'> 4401113608

#字典
tuple = (1)
dic = {1:2}
d = { tuple:1,'key2':'djx','key3':'li'}
print(d,type(d),id(d))
d['key4'] = 'haha'
print(d,type(d),id(d))

# {1: 1, 'key2': 'djx', 'key3': 'li'} <class 'dict'> 4401075976
# {1: 1, 'key2': 'djx', 'key3': 'li', 'key4': 'haha'} <class 'dict'> 4401075976