1. 程式人生 > >Python變量與常量

Python變量與常量

alloc 等號 解釋器 exc roc java 分享圖片 聲明 分享

1、什麽是變量

a=1,其中 a 就是變量名稱,1 就是它的值。在程序運行過程中,變量的值一般都會發生改變,內存中會專門開辟一段空間,用來存放變量的值,而變量名將指向這個值所在的內存空間。與變量相對的就是常量,在程序運行過程中,常量的值不會發生改變。

2、變量的命名規範

  • 變量名只能是 字母、數字或下劃線的任意組合
  • 變量名的第一個字符不能是數字
  • 以下關鍵字不能聲明為變量名
    [‘and‘, ‘as‘, ‘assert‘, ‘break‘, ‘class‘, ‘continue‘, ‘def‘, ‘del‘, ‘elif‘, ‘else‘, ‘except‘, ‘exec‘, ‘finally‘, ‘for‘, ‘from‘, ‘global‘, ‘if‘, ‘import‘, ‘in‘, ‘is‘, ‘lambda‘, ‘not‘, ‘or‘, ‘pass‘, ‘print‘, ‘raise‘, ‘return‘, ‘try‘, ‘while‘, ‘with‘, ‘yield‘]

變量的命名方式一般有2種:
1)變量中單詞與單詞之間使用下劃線分隔

hello_kitty=‘abc‘

2)變量中的每個單詞的首字母大寫

helloKitty=‘abc‘

Tip:推薦使用第一種方式~

3、變量的定義與賦值

a=1,就是一個變量的賦值過程,等號“=”左邊的值賦值給右邊的變量a,這個過程已經包含了變量的申明和定義過程,每個變量需要先賦值再使用,變量在被賦值之後才會被創建。不同於其他語言,例如在C語言中,變量在被賦值前,必須先定義變量的類型,而Python不需要,可以不定義變量的類型直接賦值,Python解釋器會根據語法和操作數決定對象的類型
技術分享圖片

動態類型語言和靜態類型語言

  • 靜態類型語言
    :數據類型在編譯期間確定,編碼時,必須明確指定變量的數據類型,然後再賦值。
    主要語言:C、C++、Java、Object-C...
    例如 java的賦值語句如下:
    String str = "abc";  
    char sex = ‘M‘;  

    ?

  • 動態類型語言:數據類型不在編譯期間確定,變量的類型綁定延後到了運行階段。變量使用之前不需要類型聲明。
    主要語言:Python、Perl、Ruby、Erlang、PHP...
    例如 python的賦值語句:
    >>> str = ‘abc‘
    >>> var = 1

在python中,可以對同一個變量反復賦值,且每次賦值的數據類型都不一致(type()函數查看數據類型):

>>> abc = 1
>>> type(abc)
<class ‘int‘>               # abc 為 int 類型

>>> abc = 1.2
>>> type(abc)
<class ‘float‘>            # abc為 float 類型

>>> abc = ‘hello‘
>>> type(abc)
<class ‘str‘>              # abc為 字符串 類型

內存圖解:
技術分享圖片

變量的賦值過程

程序中的一個賦值操作,例如:abc=1,在內存中大致可以分為兩個步驟:
1)內存中開辟一段空間用於存放值 1
2)內存中創建一個變量abc,並指向 值 1

賦值完成後,若修改 abc 的值,python解釋器並不是修改變量abc指向的內存空間中存放的值,而是重新開辟一段內存空間,將新的值存放進去,變量abc重新指向這段新開辟的內存空間:

>>> abc = 1
>>> id(abc)
1465150944

>>> abc=‘hello kitty‘
>>> id(abc)
1730859168688

註:函數id()用於查看變量的內存地址~

Python小整數對象池

示例1:

>>> a = 10
>>> b = 10
>>> id(a)
1465151232
>>> id(b)
1465151232

示例2:

>>> a = 300
>>> b = 300
>>> id(a)
1730858159920
>>> id(b)
1730858412880

如上面所說,在Python中修改變量的值並不是在對應的內存空間中直接修改,而是需要malloc重新分配內存,用完之後再回收。為了提高效率,Python解釋器將小整數[-5,257)存放在小整數對象池中,即small_ints數組中。small_ints緩存了[-5,257) 之間的所有整數,且在python解釋器初始化後small_ints數組就一直存在。若變量的值在[-5,257)範圍內,就直接從small_ints數組中獲取,而不需要再分配內存空間。

小整數的範圍為[-5,257),若要修改需要通過修改python的源代碼實現

所以如 示例1 中所示:不同的變量,它們的值是同一個小整數時,這些變量引用的是同一個對象。若整數的值不在[-5,257) 範圍內,python解釋器會將其存放在PyIntBlock中,這裏不做介紹~

其他賦值方式

多重賦值
同時為多個變量賦值。

a = b = c = 1            # a,b,c的值都為1

多元賦值
多個變量,多個值,逐一對應。

a, b, c = 1, 2, 3        # a = 1,b = 2,c = 3

分解賦值
元組分解後賦值給多個變量

a, b, c = (1,2,3)      # a = 1,b = 2,c = 3

4、python引用計數 和 垃圾回收機制

引用計數

Python使用引用計數來追蹤內存中的對象。當對象被創建並賦值給變量時,該對象的引用計數被設置為1。
當對象再次被引用時,引用計數加1。引用計數也會減少(例如del 變量名或對變量重新賦值等),當引用計數為0是,意味著這個對象已經沒有被使用~

del語句
del語句會刪除對象的一個引用,del語法:del obj[, obj2[, ...objN]]
執行 del x 後的兩個動作:
1)從現在的名稱空間中刪除x
2)x所指向的對象的引用計數減1

垃圾回收機制

Python的GC模塊通過引用計數來跟蹤和回收垃圾。在引用計數的基礎上,還可以通過“標記-清除”(mark and sweep)解決容器對象可能產生的循環引用的問題。通過“分代回收”(generation collection)以空間換取時間來進一步提高垃圾回收的效率。

5、常量

常量指在程序運行過程中不會改變的量,c語言中有專門的常量定義語法:const int a = 60; 常量定義之後就不能更改,若更改就會報錯,Python中沒有類似const這樣的修飾符,即沒有專門用於定義常量的語法,一般約定俗成 變量名以全大寫的形式來表示這是一個常量~

NAME=kitty

.................^_^

Python變量與常量