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