重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
為企業(yè)提供網(wǎng)站建設、域名注冊、服務器等服務
創(chuàng)新互聯(lián)www.cdcxhl.cn八線動態(tài)BGP香港云服務器提供商,新人活動買多久送多久,劃算不套路!
本篇文章給大家分享的是有關Python中遇到的“坑”,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
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為了避免重復的創(chuàng)建和回收,就把那些常用的整數(shù)緩存起來,每次需要使用時直接從緩存中拿,而不是重新創(chuàng)建,這些整數(shù)的范圍是[-5, 256],不在這個范圍之中的數(shù)字就要重新創(chuàng)建了。那為什么第三組的a和b是一樣的呢?這是因為Python內(nèi)部做了優(yōu)化,對于在同一個代碼塊中的代碼,如果出現(xiàn)兩個值相同的整數(shù),那么它們將被重用。這里可以用下面的代碼進行測試:
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.關于正則表達式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
運行結(jié)果和我們想象的一樣,但是如果html代碼再長一點呢?比如下面:
html = """Document h2標題
h3標題
h4標題
""" print(remove_tag(html))
運行結(jié)果如下:
Document h2標題h3標題h4標題