1.哪個(gè)是True,哪個(gè)是False?
這里要看三組代碼:
# 第一組: >>>a=256 >>>b = 256 >>>a is b # 第二組: >>>a = 257 >>>b = 257 >>>a is b # 第三組: >>>a = 257; b = 257 >>>a is b
問(wèn)題來(lái)了,這三組代碼的運(yùn)行結(jié)果分別是什么呢?答案是True、False和True。第一組和第三組結(jié)果是True好像沒(méi)問(wèn)題,那為什么第二組的結(jié)果是False呢?這里先用id()來(lái)查看一下a和b的地址是什么:
# 第一組: >>>id(a) >>>1426657040 >>>id(b) >>>1426657040 # 第二組: >>>id(a) >>>363389616 >>>id(b) >>>363392912 # 第三組: >>>id(a) >>>5722000 >>>id(b) >>>5722000
可以看到第一組和第三組的a和b的id值是相同的,但是第二組是不同的。出現(xiàn)這種情況是因?yàn)?a href="http://www.xsypw.cn/tags/python/" target="_blank">Python為了避免重復(fù)的創(chuàng)建和回收,就把那些常用的整數(shù)緩存起來(lái),每次需要使用時(shí)直接從緩存中拿,而不是重新創(chuàng)建,這些整數(shù)的范圍是[-5, 256],不在這個(gè)范圍之中的數(shù)字就要重新創(chuàng)建了。那為什么第三組的a和b是一樣的呢?這是因?yàn)镻ython內(nèi)部做了優(yōu)化,對(duì)于在同一個(gè)代碼塊中的代碼,如果出現(xiàn)兩個(gè)值相同的整數(shù),那么它們將被重用。這里可以用下面的代碼進(jìn)行測(cè)試:
#Python學(xué)習(xí)交流群:778463939 a = 257 b = 257 def func(): c = 257 print(a is c) # False print(a is b) # True func()
這段代碼中a和b的id值是一樣的,和c的id值不同。這是因?yàn)閍和b在同一個(gè)代碼塊,而c處在func函數(shù)里,屬于局部變量,和a不在同一個(gè)代碼塊。所以在創(chuàng)建c的時(shí)候會(huì)重新創(chuàng)建,但是創(chuàng)建b的時(shí)候會(huì)重用a這個(gè)對(duì)象。
在Python的交互式命令行中,每單獨(dú)一行都視為一個(gè)代碼塊,因此第三組中的a和b處在同一個(gè)代碼塊中,所以后者重用了前者,因此,兩個(gè)變量的id是相同的。
2.關(guān)于正則表達(dá)式re.sub()
都知道正則表達(dá)式中的re.sub()是用于字符串替換的,比如:
import re def remove_tag(html): text = re.sub('<.*?>', '', html, re.S) return text
這段代碼的功能就是將html中的標(biāo)簽都替換為空,沒(méi)什么好說(shuō)的,這里可以用一段html代碼來(lái)測(cè)試一下:
html = """Document """ print(remove_tag(html)) # Document
運(yùn)行結(jié)果和我們想象的一樣,但是如果html代碼再長(zhǎng)一點(diǎn)呢?比如下面:
html = """Document h1標(biāo)題
h2標(biāo)題
h3標(biāo)題
""" print(remove_tag(html))
運(yùn)行結(jié)果如下:
Document h1標(biāo)題h2標(biāo)題h3標(biāo)題