一、變量
變量是存儲在內存中的值,這就意味著在創建變量時會在內存中開辟一個空間。
基于變量的數據類型,解釋器會分配指定內存,并決定什么數據可以被存儲在內存中。
因此,變量可以指定不同的數據類型,這些變量可以存儲整數,小數或字符等
變量賦值
Python 中的變量賦值不需要類型聲明。
每個變量在內存中創建,都包括變量的標識,名稱和數據這些信息。
每個變量在使用前都必須賦值,變量賦值以后該變量才會被創建。
等號?=?用來給變量賦值。
等號?=?運算符左邊是一個變量名,等號?=?運算符右邊是存儲在變量中的值。
這種變量本身類型不固定的語言稱之為動態語言,與之對應的是靜態語言。靜態語言在定義變量時必須指定變量類型,如果賦值的時候類型不匹配,就會報錯。例如Java是靜態語言,賦值語句如下(// 表示注釋):
int a = 123; // a是整數類型變量
a = "ABC"; // 錯誤:不能把字符串賦給整型變量
和靜態語言相比,動態語言更靈活,就是這個原因。
請不要把賦值語句的等號等同于數學的等號。比如下面的代碼:
x = 10
x = x + 2
如果從數學上理解x = x + 2
那無論如何是不成立的,在程序中,賦值語句先計算右側的表達式x + 2
,得到結果12
,再賦給變量x
。由于x
之前的值是10
,重新賦值后,x
的值變成12
。
最后,理解變量在計算機內存中的表示也非常重要。當我們寫:
a = 'ABC'
時,Python解釋器干了兩件事情:
-
在內存中創建了一個
'ABC'
的字符串; -
在內存中創建了一個名為
a
的變量,并把它指向'ABC'
。
也可以把一個變量a
賦值給另一個變量b
,這個操作實際上是把變量b
指向變量a
所指向的數據,例如下面的代碼:
a = 'ABC'
b = a
a = 'XYZ'
print(b)
最后一行打印出變量b
的內容到底是'ABC'
呢還是'XYZ'
?如果從數學意義上理解,就會錯誤地得出b
和a
相同,也應該是'XYZ'
,但實際上b
的值是'ABC'
,讓我們一行一行地執行代碼,就可以看到到底發生了什么事:
執行a = 'ABC'
,解釋器創建了字符串'ABC'
和變量a
,并把a
指向'ABC'
:
執行b = a
,解釋器創建了變量b
,并把b
指向a
指向的字符串'ABC'
:
執行a = 'XYZ'
,解釋器創建了字符串'XYZ',并把a
的指向改為'XYZ'
,但b
并沒有更改:
所以,最后打印變量b
的結果自然是'ABC'
了。
多個變量賦值
Python允許你同時為多個變量賦值。例如:
a = b = c = 1
以上實例,創建一個整型對象,值為1,三個變量被分配到相同的內存空間上。
您也可以為多個對象指定多個變量。例如:
a, b, c = 1, 2, "john"
以上實例,兩個整型對象 1 和 2 分別分配給變量 a 和 b,字符串對象 "john" 分配給變量 c。
一個變量可以通過賦值指向不同類型的對象。
二、常量
所謂常量就是不能變的變量,比如常用的數學常數π就是一個常量。在Python中,通常用全部大寫的變量名表示常量:
PI = 3.14159265359
但事實上PI
仍然是一個變量,Python根本沒有任何機制保證PI
不會被改變,所以,用全部大寫的變量名表示常量只是一個習慣上的用法,如果你一定要改變變量PI
的值,也沒人能攔住你。
最后解釋一下整數的除法為什么也是精確的。在Python中,有兩種除法,一種除法是/
:
>>> 10 / 3
3.3333333333333335
/
除法計算結果是浮點數,即使是兩個整數恰好整除,結果也是浮點數:
>>> 9 / 3
3.0
還有一種除法是//
,稱為地板除,兩個整數的除法仍然是整數:
>>> 10 // 3
3
你沒有看錯,整數的地板除//
永遠是整數,即使除不盡。要做精確的除法,使用/
就可以。
因為//
除法只取結果的整數部分,所以Python還提供一個余數運算,可以得到兩個整數相除的余數:
>>> 10 % 3
1
無論整數做//
除法還是取余數,結果永遠是整數,所以,整數運算結果永遠是精確的。
三、標準數據類型
計算機顧名思義就是可以做數學計算的機器,因此,計算機程序理所當然地可以處理各種數值。但是,計算機能處理的遠不止數值,還可以處理文本、圖形、音頻、視頻、網頁等各種各樣的數據,不同的數據,需要定義不同的數據類型。在Python中,能夠直接處理的數據類型有以下幾種:
Python3 中常見的數據類型有:
- Number(數字)
- String(字符串)
- bool(布爾類型)
- List(列表)
- Tuple(元組)
- Set(集合)
- Dictionary(字典)
Python3 的六個標準數據類型中:
- 不可變數據(3 個):Number(數字)、String(字符串)、Tuple(元組);
- 可變數據(3 個):List(列表)、Dictionary(字典)、Set(集合)。
此外還有一些高級的數據類型,如: 字節數組類型(bytes)。
內置的 type() 函數可以用來查詢變量所指的對象類型。
>>> a, b, c, d = 20, 5.5, True, 4+3j >>> print(type(a), type(b), type(c), type(d)) <class 'int'> <class 'float'> <class 'bool'> <class 'complex'>
此外還可以用 isinstance 來判斷:
>>>?a?=?111
>>>?isinstance(a,?int)
True
>>>
isinstance 和 type 的區別在于:
- type()不會認為子類是一種父類類型。
- isinstance()會認為子類是一種父類類型。
>>> class A:
... pass
...
>>> class B(A):
... pass
...
>>> isinstance(A(), A)
True
>>> type(A()) == A
True
>>> isinstance(B(), A)
True
>>> type(B()) == A
False
Python3 中,bool 是 int 的子類,True 和 False 可以和數字相加,?True==1、False==0?會返回?True,但可以通過?is?來判斷類型。
在 Python2 中是沒有布爾型的,它用數字 0 表示 False,用 1 表示 True。?