python中的變與不變

The value of some objects can change. Objects whose value can change are said to be mutable; objects whose value is unchangeable once they are created are called immutable. (The value of an immutable container object that contains a reference to a mutable object can change when the latter’s value is changed; however the container is still considered immutable, because the collection of objects it contains cannot be changed. So, immutability is not strictly the same as having an unchangeable value, it is more subtle.) An object’s mutability is determined by its type; for instance, numbers, strings and tuples are immutable, while dictionaries and lists are mutable.

https://docs.python.org/3/reference/datamodel.htm


python中的變與不變


一: 可變與不可變類型定義

以上內容摘自python官方文檔中數據模型對可變和不可以變類型的介紹。其中內容大體意思是:

有些對象的值是可以改變的,這些值可變的對象稱作mutable(可變的),另外有些對象一旦創建後就不能發生改變,這些對象稱作immutable(不可變的)。(對於一些不可變的對象容器中,在python中也就是集合(但不僅僅值Set類型,比如元組)中,其包含著可以改變的對象的引用,比如包含一個list對象,但是這個對象任然是不可以變的,因為這個容器包含的元素是不能變的。所以不可變不等於嚴格意義上說的擁有一個不可以變的值,這裡有點意外)。一個對象的可變與否,取決於這個對象的type(類型),例如整數,字符串和元組是不可變對象,而字典和列表是可以變的。

二:數據類型類別劃分

以上一段話大體意思就是,python的數據類型根據值的可變與否劃分為兩類,一類是可變的,一類是不可變的。可變性是由數據類型決定的。接下來根據以上定義,我們看一下python中的數據類型進行站隊分類的。

python中的變與不變


三:可變與不可變類型的特點

  1. 不可變對象即創建後對象的值不能再進行修改,例如int類型。比如int類型,下面例子中可以看到,剛開始給a賦值1,稍後又重新對a進行賦值2,發現前後a的引用是發生了改變的,也就就是說a前後引用了不同的一塊內存和對象。後面的2是一個新建的對象,此a非彼a。
<code>>>> a = 1
>>> id(a)
1905356256
>>> a = 2
>>> id(a)
1905356288
/<code>

2.可變對象是值可以改變的數據類型。這裡我們以Set為例,顯示對a進行初始化一個值,稍後又向a這個集合中插入了一個值,發現a變了,但是它前後的引用還是相同的,也就是此a還是昨日的a,只是它包含的內容發生了改變,也就是裡面的值發生變更。

<code>>>> a = set([1])
>>> id (a)
1094877766600
>>> a.add(2)
>>> a
{1, 2}

>>> id(a)
1094877766600
/<code>


3.不變類型中包含可變類型。這種情況也就是官方中所說的變可變類型的容器中包含了可變的對象時,該類型仍是不可變的,及時其內部包含的對象是可以的。下面例子中創建了兩個列表(可變對象)a,b。依據這兩個列表生成一個tuple類型的c。同時我們向修改列表a的值,居然都可以操作成功。

<code>>>> a = [1]
>>> b = [2]
>>> c = (a, b )
>>> c
([1], [2])
>>> a.append('a')
>>> c
([1, 'a'], [2])

/<code>


四 總結:

不可變類型就是創建後值不能修改的類型,如果要修改賦值,就是丟掉現有的重新創建新的對象了,寧死不變的性質,但是它也並非嚴格意義上的堅貞不屈,留了一個後門就是用不可變的容器包含可變的對象。而可變的對象,創建後的對象值是可以發生改變,在創建時分配的哪塊內存基礎上進行增刪改操作。

這裡有個經常面試例子,想來就比較容易理解了,以下面例子作為本文結束吧。

  1. 請問A輸出什麼
<code>A = 'python'
B = A
B = 'java'

/<code>

2. 請問A輸出什麼

<code>A = ["python", "java"]
A = B
B[0] = "php"
/<code>


3.請問A輸出什麼

<code>A = ["python", "java"]
B = A[:]
B[0] = "php"
/<code>



分享到:


相關文章: