Python變量與動態數據類型

變量與動態數據類型

變量與對象


x=5

Python執行上面一句代碼時分爲三步

1:創建代表整數5的對象(所有數據都以對象方式存在)

2:檢查變量x是否存在,若不存在則創建

3:簡歷變量x到對象5的引用(引用實質上就是指針)

Python中使用變量,應該理解:

變量第一次賦值時被創建,再次出現直接使用

變量沒有數據類型概念,數據類型屬於對象,類型決定了對象在內存中的存儲方式。

變量引用了對象。當在表達式中使用變量時,變量立即被其引用的對象替代,所以變量在使用之前必須賦值


>>>x=5
>>>print(x+3)   #執行時變量x被對象5替代,語句實際爲print(5+3)
8

對象的垃圾回收

在對象沒有任何引用時,其佔用的內存空間會自動被回收--成爲自動垃圾回收。在內部,Python爲每個對象創建一個計數器,計數器記錄對象的引用次數。當計數器爲0是,對象被刪除,其佔用的內存被回收。

>>> x=5
>>> type(x)  #實際執行的是type(5),因此類型是int
<class 'int'>
>>> x=1.5
>>> type(x)  #此時對象5已被回收,執行的是type(1.5),因此類型是float
<class 'float'>
>>> x='abc'
>>> type(x)  #此時對象1.5已被回收,執行的是type('abc'),因此類型是str
<class 'str'>
>>>

變量命名規則

變量支持以下劃線或字母開頭,後面接任意數量的下劃線、字母、數字。Python3.x支持Unicode字符,因此漢子也可作爲變量名。

以下爲Python保留字

and del For is raise assert elif from lambda return break else global not try class except if or while continue exec import pass with def finally in print yield

使用慣例

前後有下劃線的變量名通常爲系統變量,例如,_name_、_doc_都是系統變量
以一個下劃線開頭的變量(如_abc)不能被from...import *語句從模塊導入。
以兩個下劃線開頭、末尾無下劃線的變量(如__abc)是類的本地變量。

賦值語句

簡單賦值


x=100

序列賦值

序列賦值指“=”左側是元組、列表表示的多個變量名,右側是元組、列表或字符串等序列表示的值。序列賦值可以一次性爲多個變量賦值。Python順序匹配變量名和值。


>>> x,y=1,2  #使用省略圓括號的元組賦值
>>> x,y
(1, 2)
>>> x
1
>>> (x,y)=(10,20)  #使用元組賦值
>>> x,y
(10, 20)
>>> [x,y]=[30,'abc']  #使用列表賦值
>>> x,y
(30, 'abc')
>>>

當“=”右側爲字符串時,Python會將字符串分解爲單個字符,以次賦值給各個變量,此時變量個數和字符個數必須相等,否則出錯。


>>> (x,y,z)='abc'   #使用字符串賦值
>>> x,y,z
('a', 'b', 'c')
>>> ((x,y),z)='ab','cd'  #使用嵌套的元組
>>> x,y,z
('a', 'b', 'cd')
>>>

可以在變量名之前使用“*”,爲變量創建列表對象引用。此時,不帶星號變量匹配的一個值,剩餘的值作爲列表對象。

>>> x,*y='abcd'  #x匹配第一個字符,剩餘字符作爲列表匹配y
>>> x,y
('a', ['b', 'c', 'd'])  
>>> *x,y='abcd'   #y匹配最後一個字符,剩餘字符作爲列表匹配x
>>> x,y
(['a', 'b', 'c'], 'd')
>>> x,*y,z='abcde'
>>> x,y,z
('a', ['b', 'c', 'd'], 'e')
>>> x,*y=[1,2,'abc','漢字']
>>> x,y
(1, [2, 'abc', '漢字'])
>>>

多目標賦值

多目標賦值指用連續的多個“=”爲變量賦值


>>> a=b=c=10  #多目標賦值
>>> a,b,c
(10, 10, 10)
>>>

注意這裏作爲值的證書對象10在內存中只有一個,變量a、b、c引用同一個變量

變量的共享引用

共享引用指多個變量引用了同一個對象。例如:

>>> x=5
>>> y=x  #實際執行y=5,餘變量x同時引用證書對象5
>>> x,y  #
(5, 5)
>>> x=6  #變量x引用新的對象6,這裏並不影響y的引用
>>> x,y
(6, 5)
>>>

從上面的代碼可以看出,將變量賦值給另一個變量時,將會使兩個變量引用同一個對象。對變量富裕新的值,會使變量引用新的對象,原來的引用被刪除。

給變量共享引用時,如果修改了被引用的對象,意味着所有引用對象的變量獲得的將是改變後的對象的值。例如:

>>> x=[1,2,3]  #使y和x引用同一個列表對象[1,2,3]
>>> y=x
>>> x,y
([1, 2, 3], [1, 2, 3]) #y和x的輸出相同
>>> x[0]=6   #通過變量x修改列表對象的第一項
>>> x,y
([6, 2, 3], [6, 2, 3])  
>>>x is y
True
>>>
>>> x=[1,2,3]  #使y和x引用同一個列表對象[1,2,3]
>>> y=x
>>> x,y
([1, 2, 3], [1, 2, 3])
>>>x is y
True
>>> y=[4,5,6]  #變量y引用新的對象[4,5,6],這樣就不影響x的使用
>>> x is y
False
>>> x,y
([1, 2, 3], [4, 5, 6])
>>>

>>> x=[1,2,3]
>>> y=[1,2,3] #兩個[1,2,3] 並不是一個對象
>>> x is y
False
>>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章