1.哪個是True,哪個是False?
這里要看三組代碼:
# 第一組: >>>a=256 >>>b = 256 >>>a is b # 第二組: >>>a = 257 >>>b = 257 >>>a is b # 第三組: >>>a = 257; b = 257 >>>a is b
問題來了,這三組代碼的運行結(jié)果分別是什么呢?答案是True、False和True。第一組和第三組結(jié)果是True好像沒問題,那為什么第二組的結(jié)果是False呢?這里先用id()來查看一下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)這種情況是因為Python為了避免重復(fù)的創(chuàng)建和回收,就把那些常用的整數(shù)緩存起來,每次需要使用時直接從緩存中拿,而不是重新創(chuàng)建,這些整數(shù)的范圍是[-5, 256],不在這個范圍之中的數(shù)字就要重新創(chuàng)建了。那為什么第三組的a和b是一樣的呢?這是因為Python內(nèi)部做了優(yōu)化,對于在同一個代碼塊中的代碼,如果出現(xiàn)兩個值相同的整數(shù),那么它們將被重用。這里可以用下面的代碼進(jìn)行測試:
#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值不同。這是因為a和b在同一個代碼塊,而c處在func函數(shù)里,屬于局部變量,和a不在同一個代碼塊。所以在創(chuàng)建c的時候會重新創(chuàng)建,但是創(chuàng)建b的時候會重用a這個對象。
在Python的交互式命令行中,每單獨一行都視為一個代碼塊,因此第三組中的a和b處在同一個代碼塊中,所以后者重用了前者,因此,兩個變量的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)簽都替換為空,沒什么好說的,這里可以用一段html代碼來測試一下:
html = """Document """ print(remove_tag(html)) # Document
運行結(jié)果和我們想象的一樣,但是如果html代碼再長一點呢?比如下面:
html = """Document h1標(biāo)題
h2標(biāo)題
h3標(biāo)題
""" print(remove_tag(html))
運行結(jié)果如下:
Document h1標(biāo)題h2標(biāo)題h3標(biāo)題