h5做招聘網(wǎng)站簡(jiǎn)述網(wǎng)站推廣的方式
1. 字典拷貝
有些場(chǎng)景下,需要對(duì)字典拷貝一個(gè)副本。這個(gè)副本用于保存原始數(shù)據(jù),然后原來(lái)的字典去參與其他運(yùn)算,或者作為參數(shù)傳遞給一些函數(shù)。
例如,
>>> dict_a = {"name": "John", "address":"221B Baker street"}
>>> dict_b = dict_a
利用賦值運(yùn)算法把dict_a賦值給dict_b之后,這2個(gè)變量的值是相同的。
你或許會(huì)拿著dict_b去參與其他的運(yùn)算,例如,更新/添加鍵值對(duì)。
但事實(shí)卻不是你認(rèn)為的那樣,如果你更新或者編輯dict_b,dict_a也會(huì)隨之改變,詳細(xì)內(nèi)容可以了解一下Python可變對(duì)象與不可變對(duì)象。
下面來(lái)看一下效果:
>>> dict_b["age"] = 26
>>> dict_b
{'address': '221B Baker street', 'name': 'John', 'age': 26}
>>> dict_a
{'address': '221B Baker street', 'name': 'John', 'age': 26}
你會(huì)發(fā)現(xiàn),給dict_b添加了一個(gè)age:26鍵值對(duì),dict_a也更新了,這樣,我們留一個(gè)副本就沒(méi)有任何意義了。
針對(duì)這個(gè)問(wèn)題,可以用Python中的淺拷貝copy、深拷貝deepcopy來(lái)解決,下面來(lái)看一下,
>>> dict_c = dict_b.copy()
>>> dict_c["location"] = "somewhere"
>>> dict_c
{'address': '221B Baker street', 'name': 'John', 'age': 26, 'location': 'somewhere'}
>>> dict_b
{'address': '221B Baker street', 'name': 'John', 'age': 26}
2. 字典鍵值 True和1
>>> dict_a = dict()
>>> dict_a
{}
>>> dict_a[1] = "apple"
>>> dict_a[True] = "mango"
>>> dict_a[2] = "melon"
>>> dict_a
{1: 'mango', 2: 'melon'}
你注意到發(fā)生了什么嗎?
輸出字典之后,發(fā)現(xiàn)鍵值True沒(méi)有了!
這是因?yàn)?#xff0c;在Python中,True相當(dāng)于1、False相當(dāng)于0,因此,在dict_a[True] = "mango"這行代碼里,它把原來(lái)鍵值為1給替換了。
可以來(lái)驗(yàn)證一下True相當(dāng)于1的說(shuō)法:
>>> isinstance(True, int)
True
>>> True == 1
True
3.駐留字符串
在某些情況下,Python嘗試重用現(xiàn)有的不可變對(duì)象。
字符串駐留就是這樣一種情況。來(lái)看一個(gè)示例對(duì)比,
>>> a = "gmail"
>>> b = "gmail"
>>> a is b
True
然后修改一下,
>>> a = "@gmail"
>>> b = "@gmail"
>>> a is b
False
是不是很神奇?我們只加了一個(gè)@符號(hào),結(jié)果卻截然不同!
在第一個(gè)實(shí)現(xiàn)方法中,嘗試創(chuàng)建兩個(gè)不同的字符串對(duì)象。但是當(dāng)檢查兩個(gè)對(duì)象是否相同時(shí),它返回True。
?這是因?yàn)閜ython并沒(méi)有創(chuàng)建另一個(gè)對(duì)象b,而是將b指向了第一個(gè)值gmail,換句話說(shuō)它被駐留了。
但是,如果字符串中除ASCII字符、數(shù)字、下劃線以外的其他字符時(shí),它則不會(huì)駐留,這樣的話,它就不會(huì)再指向@gmail。
這里需要注意一下,is與==的運(yùn)算是不同的。
==用于判斷值是否相等,is不僅需要值相等,還需要指向同一個(gè)對(duì)象。
>>> a = "@gmail"
>>> b = "@gmail"
>>> a is b
False
>>> a == b
True
4. 默認(rèn)參數(shù)只計(jì)算一次
>>> def func(a, lst=[]):
... lst.append(a)
... return lst
...
>>> print(func(1))
[1]
>>> print(func(2))
[1, 2]
這里發(fā)生了什么?
我在func中給了一個(gè)默認(rèn)參數(shù)[],然后先后調(diào)用2次func函數(shù)。
按照我們常規(guī)的認(rèn)識(shí),這2次調(diào)用是分開(kāi)的,第1次調(diào)用輸出[1],第二次應(yīng)該輸出[2],為什么第2次調(diào)用時(shí)列表里竟然還保留著第1次調(diào)用時(shí)的值?
這是因?yàn)?#xff0c;在Python中,默認(rèn)參數(shù)只會(huì)被計(jì)算一次。第1次調(diào)用func(1)時(shí),它用到了默認(rèn)參數(shù)。但是,第2次調(diào)用就不會(huì)再去計(jì)算默認(rèn)參數(shù),直接在[1]的基礎(chǔ)上附加一個(gè)值。