1.哪個是True,哪個是False?
這里要看三組代碼:
# 第一組: >>>a=256 >>>b = 256 >>>a is b # 第二組: >>>a = 257 >>>b = 257 >>>a is b # 第三組: >>>a = 257; b = 257 >>>a is b
問題來了,這三組代碼的運行結果分別是什么呢?答案是True、False和True。第一組和第三組結果是True好像沒問題,那為什么第二組的結果是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值是相同的,但是第二組是不同的。出現這種情況是因為Python為了避免重復的創建和回收,就把那些常用的整數緩存起來,每次需要使用時直接從緩存中拿,而不是重新創建,這些整數的范圍是[-5, 256],不在這個范圍之中的數字就要重新創建了。那為什么第三組的a和b是一樣的呢?這是因為Python內部做了優化,對于在同一個代碼塊中的代碼,如果出現兩個值相同的整數,那么它們將被重用。這里可以用下面的代碼進行測試:
#Python學習交流群: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函數里,屬于局部變量,和a不在同一個代碼塊。所以在創建c的時候會重新創建,但是創建b的時候會重用a這個對象。
在Python的交互式命令行中,每單獨一行都視為一個代碼塊,因此第三組中的a和b處在同一個代碼塊中,所以后者重用了前者,因此,兩個變量的id是相同的。
2.關于正則表達式re.sub()
都知道正則表達式中的re.sub()是用于字符串替換的,比如:
import re def remove_tag(html): text = re.sub('<.*?>', '', html, re.S) return text
這段代碼的功能就是將html中的標簽都替換為空,沒什么好說的,這里可以用一段html代碼來測試一下:
html = """Document """ print(remove_tag(html)) # Document
運行結果和我們想象的一樣,但是如果html代碼再長一點呢?比如下面:
html = """Document h1標題
h2標題
h3標題
""" print(remove_tag(html))
運行結果如下:
Document h1標題h2標題h3標題