0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Python中的那些坑

馬哥Linux運維 ? 來源:博客園 ? 2024-07-16 17:52 ? 次閱讀

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)題

為什么最后會多出來呢?這兩個標(biāo)簽不應(yīng)該被替換掉嗎?問題在于re.sub()的第四個參數(shù),這里先看下sub()函數(shù)的原型:

re.sub(pattern, repl, string, count=0, flags=0)

那為什么我們把re.S放在count的位置也沒有報錯呢?難道說re.S是一個數(shù)字?打印出來看一下:

import re

print(re.S)
# 16

原來re.S還可以當(dāng)數(shù)字用!這時候數(shù)一下上面那段html代碼中的標(biāo)簽個數(shù),發(fā)現(xiàn)是第17和第18個,而因為re.S被當(dāng)做16傳給count參數(shù)了,就導(dǎo)致最后兩個標(biāo)簽沒有被替換掉。

3.字符串的lstrip()

相信很多人都用過lstrip(),在處理字符串的時候很有用,比如:

print("aabbcc".lstrip('aa'))
# bbcc

這很簡單,也沒什么問題,但是看下面這個例子:

print("ababacac".lstrip("ab"))
# cac

為什么結(jié)果不是acac呢?這是因為當(dāng)lstrip()中傳入一個字符串后,lstrip()會把這個字符串拆成一個個字符,然后才從左往右進(jìn)行檢查,如果匹配到就刪除,直到出現(xiàn)第一個不同的字符,所以最后"ababa"被刪掉了,結(jié)果也就是"cac"了。要避免這種情況的話,可以用replace()方法進(jìn)行替換。

4.嵌套列表

如果要你創(chuàng)建一個包含三個空列表的列表,你會怎么做呢?

# 選項1
li =[[] for i in range(3)]

# 選項2
li = [[]*3]

# 選項3
li = [[]]*3

如果你運行一下,就會知道選項1和選項3能夠得到我們想要的結(jié)果。這時候再運行一下下面這段代碼:

li = [[]]*3
li[0].append(1)
print(li)
# [[1], [1], [1]]

為什么我們明明只給第一個列表增加了一個1,但是其他兩個列表也增加了一個1呢?這是因為[[]]*3并不是創(chuàng)建了三個不同的列表,而是創(chuàng)建了三個指向同一個列表的對象,所以,當(dāng)我們操作第一個列表時,其他兩個列表內(nèi)容也會發(fā)生變化。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 字符串
    +關(guān)注

    關(guān)注

    1

    文章

    579

    瀏覽量

    20549
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4797

    瀏覽量

    68707
  • python
    +關(guān)注

    關(guān)注

    56

    文章

    4797

    瀏覽量

    84787

原文標(biāo)題:Python中的那些“坑”

文章出處:【微信號:magedu-Linux,微信公眾號:馬哥Linux運維】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    如何避開智能硬件創(chuàng)業(yè)的那些!

    大數(shù)據(jù)等附加價值。今天我們邀請到幻響神州創(chuàng)始人兼CEO張總,為大家解答如何避開智能硬件創(chuàng)業(yè)的那些。專家介紹:張昕尉是十年創(chuàng)業(yè)老兵,2016年2月帶領(lǐng)幻響新三板上市,堅持原創(chuàng)態(tài)度,以虔誠之心做企業(yè)做產(chǎn)品
    發(fā)表于 03-14 10:13

    python2和python3同時安裝的詳細(xì)步驟

    整理下python2和python3同時安裝詳細(xì)步驟希望對大家有幫助已踩過(親測可用?。。。?/div>
    發(fā)表于 10-27 09:31

    運放那些——第二篇

    運放那些——第二篇
    的頭像 發(fā)表于 08-31 11:37 ?1.5w次閱讀
    運放<b class='flag-5'>中</b>的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>——第二篇

    運放那些——第一篇

    運放那些——第一篇
    的頭像 發(fā)表于 08-31 11:40 ?4.5w次閱讀
    運放<b class='flag-5'>中</b>的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>——第一篇

    Python程序員必須掌握從Python2到Python3的轉(zhuǎn)型

    本書的目標(biāo)讀者是那些正在使用 Python,又想熟悉 Python 3 的程序員。如果你懂 Python2,但是想遷移到 Python 3.
    發(fā)表于 09-14 10:54 ?10次下載

    如何讓你的Python編程不出現(xiàn)反模式?避免初學(xué)Python常見的錯誤

    篇文章收集了我在Python新手開發(fā)者寫的代碼中所見到的不規(guī)范但偶爾又很微妙的問題。本文的目的是為了幫助那些新手開發(fā)者渡過寫出丑陋的Python代碼的階段。
    的頭像 發(fā)表于 09-24 10:38 ?2803次閱讀

    如何快速學(xué)習(xí)Python?學(xué)習(xí)Python有哪些?

    此外,作為人工智能的主要編程語言,未來的幾年,Python勢必繼續(xù)高歌。而近期,數(shù)據(jù)科學(xué)網(wǎng)站KDnuggets,發(fā)布的2018數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)工具調(diào)查結(jié)果也顯示:Python榮登第一,成為最受青睞
    的頭像 發(fā)表于 11-29 10:11 ?3931次閱讀
    如何快速學(xué)習(xí)<b class='flag-5'>Python</b>?學(xué)習(xí)<b class='flag-5'>Python</b>有哪些<b class='flag-5'>坑</b>?

    關(guān)于 STM32 時鐘配置的那些

    關(guān)于STM32時鐘配置的那些
    的頭像 發(fā)表于 03-08 12:06 ?5948次閱讀

    python的優(yōu)缺點有哪些

    Python的定位是“優(yōu)雅”、“明確”、“簡單”,所以Python程序看上去總是簡單易懂,初學(xué)者學(xué)Python,不但入門容易,而且將來深入下去,可以勝任那些非常非常復(fù)雜的應(yīng)用程序開發(fā)。
    的頭像 發(fā)表于 01-16 09:20 ?3512次閱讀

    “I2C”的那些

    “I2C”的那些 一般情況下, i2c 設(shè)備焊接沒什么問題,按照設(shè)備手冊一步步來,基本上就順風(fēng)順?biāo)軌蛴闷饋?。如果這么一個簡單的東西,有時候想要的結(jié)果死活不出來,反復(fù)的檢查問題的原因,查詢解決辦法
    發(fā)表于 11-06 10:05 ?8次下載
    “I2C”的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    Arduino-IDE配置ESP32-CAM開發(fā)環(huán)境踩過的那些

    Arduino-IDE配置ESP32-CAM開發(fā)環(huán)境踩過的那些
    發(fā)表于 11-30 18:36 ?24次下載
    Arduino-IDE配置ESP32-CAM開發(fā)環(huán)境踩過的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    EFM32PG1B使用時遇到那些

    EFM32PG1B使用時遇到那些的坑坑一:引腳功能定義二:外部中斷的使用官網(wǎng)鏈接一:引腳功能定義?公司項目需要用到EFM32系列的單片機(jī),初看芯片手冊,看到引腳定義的時候著實有些疑惑?初看的第一
    發(fā)表于 12-03 15:06 ?3次下載
    EFM32PG1B使用時遇到<b class='flag-5'>那些</b>的<b class='flag-5'>坑</b>

    EFM32PG1B關(guān)于RTCC和EM4的那些

    EFM32PG1B關(guān)于RTCC和EM4的那些EFM32PG1B關(guān)于RTCC和EM4的那些坑坑一:RTCC初始化二:EM4低功耗模式的初始化
    發(fā)表于 12-04 19:36 ?10次下載
    EFM32PG1B關(guān)于RTCC和EM4的<b class='flag-5'>那些</b><b class='flag-5'>坑</b>

    pythonnumber代表什么

    Python,number(數(shù)字)是一種內(nèi)置的數(shù)據(jù)類型,用于表示數(shù)值。Python提供了幾種不同的number類型,分別是整數(shù)(int)、浮點數(shù)(float)、復(fù)數(shù)(complex)和布爾值
    的頭像 發(fā)表于 11-22 09:50 ?2059次閱讀

    pythontext的用法

    Python的text是一個常見的數(shù)據(jù)類型,它用于存儲和處理文本數(shù)據(jù)。在Python,文本常常被表示為字符串(string),字符串是一系列Unicode字符的有序序列。 在
    的頭像 發(fā)表于 11-23 15:46 ?3729次閱讀