語句與語法
- 井號(#) 表示之后的字符都是注釋
- 換行(\n) 標準的行分隔符
- 反斜杠(\) 繼續(xù)上一行
- 分號(;) 將兩個語句連接在一起
- 冒號(:) 將代碼塊的頭和體分開
- 語句(代碼塊) 用縮進塊的方式體現(xiàn)
- 不同的縮進深度分隔不同的代碼塊
- Python 文件以模塊的形式組織
變量賦值
Python語言中,等號(=)是主要的賦值操作符(其他的是增量賦值操作符)
注意,賦值并不是直接將一個值賦給一個變量。在Python語言中,對象是通過引用傳遞的。在賦值時,是將該對象的引用(并不是值)賦值給變量
與C語言不同,賦值語句不是一個表達式,不會返回值,所以下面的語句在python中是非法的
In [1]: x = 1
In [2]: y = (x = x + 1) # 賦值語句不是合法的表達式
File "<ipython-input-2-e5f0ec7f4848>", line 1
y = (x=x+1)
^
SyntaxError: invalid syntax
增量賦值
+=、 -=、 *=、 /=、 %=、 **=、 <<=、 >>=、 &=、 ^=、 |=
注意:對于不可變對象,增量賦值和普通賦值兩者一致;但是對于可變對象(列表,字典),增量賦值和普通賦值存在差異,要特別注意。
對于不可變對象,A = A + B 和 A += B 兩種賦值都會將A指向一個新的對象,即id(A)在賦值前后會改變;對于可變對象,如List,A = [1]; A += [2, 3] A的值變?yōu)閇1,2,3] 但A指向的List對象不變,即賦值前后id(A)不變;A = [1]; A = A + [2, 3] A的值也變?yōu)榱薣1,2,3],但A指向的List對象變了,即賦值前后id(A)的值變了
多重賦值
x = y = z = 1
多元賦值
In [3]: x, y, z = 1, 2.0, 'a string'
In [4]: x
Out[4]: 1
In [5]: y
Out[5]: 2.0
In [6]: z
Out[6]: 'a string'
多元賦值可以用于變量值互換
In [7]: x, y = 1, 2
In [8]: x
Out[8]: 1
In [9]: y
Out[9]: 2
In [10]: x, y = y, x
In [11]: x
Out[11]: 2
In [12]: y
Out[12]: 1
內(nèi)存管理
- 變量無須事先聲明;
- 變量無須指定類型;
- 程序員不用關心內(nèi)存管理;
- 變量名會被“回收”;
- del語句能直接釋放資源;
為了追蹤內(nèi)存中的對象,Python使用了引用計數(shù)這項技術。Python內(nèi)部記錄著所有使用中的對象各有多少個引用。一個內(nèi)部跟蹤變量,稱為一個引用計數(shù)器。每個對象各有多少個引用,簡稱引用計數(shù)。
當對象被創(chuàng)建時,就創(chuàng)建了一個引用計數(shù),當這個對象不再需要時,也就是說,這個對象的引用計數(shù)變成0時,它被垃圾回收(嚴格來說這不是100%正確,不過現(xiàn)階段你可以這么理解)
增加引用計數(shù)
當對象被創(chuàng)建并(將其引用)賦值給變量時,該對象的引用計數(shù)就被設置為1.
下面這些情況對象的引用計數(shù)會增加
- 對象被創(chuàng)建 (例: x = 3.14 )
- 另外的別名被創(chuàng)建 (例: y = x )
- 作為參數(shù)傳遞給函數(shù) (例: foobar(x) )
- 成為容器對象的一個元素 (例: myList = [123, x , 'xyz'] )
減少引用計數(shù)
當對象的引用被銷毀時,會減少引用計數(shù)。
下面這些情況對象的引用計數(shù)會減少
- 一個本地引用離開了其作用范圍。 比如 foobar() 函數(shù)結束
- 對象的別名被顯式銷毀。比如 del y
- 對象的一個別名被賦值給其他對象。比如 x = 'xyz'; y = x; x = 123,當123被賦值給x時,'xyz'計數(shù)減1
- 對象被從一個容器對象中移除。比如 myList.remove(x)
- 容器對象本身被銷毀。比如 del myList