2.1 賦值運算符(=),引用傳遞
我們可以直接將一個固定的數值、字符串、算術表達式、甚至函數賦值給一個變量,也可將一個變量賦值給另一個變量。
anInt = 1
aStr = 'abc'
aFloat = 4 * 5 * 6
aList = [1, 'who', 3.14]
這裏需要提到一個非常基礎且重要的知識點,在Python中,所有的變量都可以理解是內存中一個對象的“引用”,變量的賦值是引用傳遞,而非值傳遞。
可以把變量是內存中一個對象的“引用”,簡單理解爲給對象取了一個名字,或者打上了一個標籤,比如a=1,就是將對象“1”起名爲“a”。很多地方會採用一種說法:a指向1。
可以通過一個例子來理解:
a = 1
id(a) #id(…)用於輸出變量的地址,此處輸出變量a的地址
b = 2
id(b)
b = a
id(b)
print(b)
這段代碼輸出的結果是:
140360412074952
140360412074928 #b的初始地址
140360412074952 #b的地址變爲與a相同
1
利用id(…)可以輸出某一個變量的地址,可以發現在執行了b = a之後,b不僅與a的值相同,b的地址也與a相同,這也就體現了Python的賦值是“引用傳遞”,即此時b是a的一個別名,這兩個變量所保存的對象是一個對象(地址相同)。
如果在C++中執行b = a,就會產生不同的結果
int a = 1;
int b = 2;
cout<<&a<<endl; //c++中利用&取變量地址
cout<<&b<<endl;
b = a
cout<<&b<<endl;
cout<<b<<endl;
輸出結果:
0x7ffcb30f82fc
0x7ffcb30f82f8
0x7ffcb30f82f8
1 //b只改變了值,地址未改變
可見,C++中相同語句b=a執行的就是值傳遞,b只有值與a相同。
Python中引用傳遞的概念先提這麼多,在之後介紹對象、函數的過程中會再次遇到。
2.2 一般的賦值語法
Python除了可以直接將一個值或變量賦值給另一個變量之外,也有許多其他的賦值語法。
- 鏈式賦值
a = b = c = 1
- 增量賦值
a += 1 #等價於a = a + 1
a %= 2 #等價於a = a % 2
需要注意的是Python不支持類似於這樣的自增運算符:x++ ++x
- 多元賦值
多元賦值的特性允許一個語句對多個變量分別賦不同值
a, b, c = 1, 2, 3 # a = 1, b = 2, c = 3
這時等號兩邊的對象實際上都是一個元組(tuple),即一個不可變的序列集合,因此嚴格來說,上述代碼原本的形式是:
(a, b, c) = (1, 2, 3)
當然不加小括號在語法上不會有錯誤,《Python核心編程》中建議添加小括號,以增強可讀性。