Python五個極易混淆的核心概念
最近一周思考總結(jié)了Python 5個比較容易混淆的核心概念,同時附上我最通俗的區(qū)分和理解方法,相信對你一定有幫助!
1 變量賦值和別名
Python變量賦值是指創(chuàng)建一個對象并綁定到某個變量上,如下創(chuàng)建一個列表對象,并賦值給變量a:
- a = [3,1,2]
以上基本范式可表達為:
- variable1 = object1
而別名是指變量1賦值給變量2的過程:
- variable2 = variable1
比如:
- b = a
并且修改變量b,變量a也會變化,所以被稱為別名:
- b[0] = 8 # a[0] 也會變?yōu)?
2 別名和淺拷貝
別名和淺拷貝會被經(jīng)常混淆,別名如上所述僅僅是某個變量賦值給某個變量,僅此而已。
而淺拷貝已經(jīng)發(fā)生一層復制,并且在這一層上修改某個變量,不會影響另一個變量。如下:
- b = a.copy()
- b[0] = 8 # 此時修改b[0]不會影響a
3 == 和 is
Python一切皆對象,而每個對象又有"三大件":
- 編號
- 類型
- 值
基于此,A == B 比較的是對象A和B的值是否相等;A is B 比較的是對象A和B的編號是否相等。記住這句話,或許你再也不會混淆這兩個操作符。
4 淺拷貝和深拷貝
對象是可以做有限次嵌套的,可以有很多層。
淺拷貝只拷貝最外層;而深拷貝會拷貝所有層。
- a = [[3,1,2], [5,4,6]]
淺拷貝意味著修改b的第一層不影響a,但是修改b的第二層會同步影響到a,如下修改第二層會同步影響a
- from copy import copy
- In [8]: b=copy(a)
- In [9]: b[0][0]=8
- In [10]: a
- Out[10]: [[8, 1, 2], [5, 4, 6]]
- In [11]: b
- Out[11]: [[8, 1, 2], [5, 4, 6]]
而深拷貝后,修改b的任意層都不會影響a
5 可變和不可變
還記得第3節(jié)提起的每個對象"三大件"嗎?每個對象都有類型,而我們討論可變和不可變時,其實指代的正是類型。
不可變的類型常見的:整型、字符串、浮點型、元組、凍結(jié)集合
可變的類型常見的:列表、字典、集合
不可變意味著值不能被修改,如下修改元組的值,會拋出TypeError的異常,這是和類型密切相關(guān)的異常:
- a = (3,1)
- a[0] = 10
- TypeError: 'tuple' object does not support item assignment
而可變意味著值能被修改:
- In [14]: a = [3,1]
- In [15]: a[0] = 10
- In [16]: a
- Out[16]: [10, 1]