
Python是一款使用方便,易上手的工具,我們平常在工作中經常會用到,而且同時也是一款功能強大的編程語言,被廣泛應用于數據分析、web開發、人工智能等行業。但是無論那個行業,哪個領域,想要熟練使用Python,就必須掌握Python的基礎知識。
以下文章來源于:微信公眾號Python貓
作者: 豌豆花下貓
從接觸 Python 時起,我就覺得 Python 的元組解包(unpacking)挺有意思,非常簡潔好用。
最顯而易見的例子就是多重賦值,即在一條語句中同時給多個變量賦值:
>>> x, y = 1, 2 >>> print(x, y) # 結果:1 2
在此例中,賦值操作符“=”號的右側的兩個數字會被存入到一個元組中,即變成 (1,2),然后再被解包,依次賦值給“=”號左側的兩個變量。
如果我們直接寫x = 1,2 ,然后打印出 x,或者在“=”號右側寫成一個元組,就能證實到這一點:
>>> x = 1, 2 >>> print(x) # 結果:(1, 2) >>> x, y = (1, 2) >>> print(x, y) # 結果:1 2
一些博客或公眾號文章在介紹到這個特性時,通常會順著舉一個例子,即基于兩個變量,直接交換它們的值:
>>> x, y = 1, 2 >>> x, y = y, x >>> print(x, y) # 結果:2 1
一般而言,交換兩個變量的操作需要引入第三個變量。道理很簡單,如果要交換兩個杯子中所裝的水,自然會需要第三個容器作為中轉。
然而,Python 的寫法并不需要借助中間變量,它的形式就跟前面的解包賦值一樣。正因為這個形式相似,很多人就誤以為Python 的變量交換操作也是基于解包操作。
但是,事實是否如此呢?
我搜索了一番,發現有人試圖回答過這個問題,但是他們的回答基本不夠全面。(當然,有不少是錯誤的答案,還有更多人只是知其然,卻從未想過要知其所以然)
先把本文的答案放出來吧:Python 的交換變量操作不完全基于解包操作,有時候是,有時候不是!
有沒有覺得這個答案很神奇呢?是不是聞所未聞?!
到底怎么回事呢?先來看看標題中最簡單的兩個變量的情況,我們上dis 大殺器看看編譯的字節碼:
上圖開了兩個窗口,可以方便比較“a,b=b,a”與“a,b=1,2”的不同:
很明顯,形式相似的兩種寫法實際上完成的操作并不相同。在交換變量的操作中,并沒有裝包和解包的步驟!
ROT_TWO 指令是 CPython 解釋器實現的對于棧頂兩個元素的快捷操作,改變它們指向的引用對象。
還有兩個類似的指令是 ROT_THREE 和 ROT_FOUR,分別是快捷交換三和四個變量(摘自:ceval.c 文件,最新的 3.9 分支):
預定義的棧頂操作如下:
查看官方文檔中對于這幾個指令的解釋,其中 ROT_FOUR 是 3.8 版本新加的:
ROT_TWO
Swaps the two top-most stack items.
ROT_THREE
Lifts second and third stack item one position up, moves top down to position three.
ROT_FOUR
Lifts second, third and forth stack items one position up, moves top down to position four.New in version 3.8.
CPython 應該是以為這幾種變量的交換操作很常見,因此才提供了專門的優化指令。就像 [-5,256] 這些小整數被預先放到了整數池里一樣。
對于更多變量的交換操作,實際上則會用到前面說的解包操作:
截圖中的 BUILD_TUPLE 指令會將給定數量的棧頂元素創建成元組,然后被 UNPACK_SEQUENCE 指令解包,再依次賦值。
值得一提的是,此處之所以比前面的“a,b=1,2”多出一個 build 操作,是因為每個變量的 LOAD_FAST 需要先單獨入棧,無法直接被組合成 LOAD_CONST 入棧。也就是說,“=”號右側有變量時,不會出現前文中的 LOAD_CONST 一個元組的情況。
最后還有一個值得一提的細節,那幾個指令是跟棧中元素的數量有關,而不是跟賦值語句中實際交換的變量數有關??匆粋€例子就明白了:
分析至此,你應該明白前文中的結論是怎么回事了吧?
我們稍微總結一下:
以上就是小編今天跟大家分享的python基礎語句的一些內容了,希望對大家和使用python有幫助。任何學習都不是一蹴而就的,平時大家要注意多總結,多復盤,并結合實際項目去應用!
數據分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
CDA數據分析師證書考試體系(更新于2025年05月22日)
2025-05-26解碼數據基因:從數字敏感度到邏輯思維 每當看到超市貨架上商品的排列變化,你是否會聯想到背后的銷售數據波動?三年前在零售行 ...
2025-05-23在本文中,我們將探討 AI 為何能夠加速數據分析、如何在每個步驟中實現數據分析自動化以及使用哪些工具。 數據分析中的AI是什么 ...
2025-05-20當數據遇見人生:我的第一個分析項目 記得三年前接手第一個數據分析項目時,我面對Excel里密密麻麻的銷售數據手足無措。那些跳動 ...
2025-05-20在數字化運營的時代,企業每天都在產生海量數據:用戶點擊行為、商品銷售記錄、廣告投放反饋…… 這些數據就像散落的拼圖,而相 ...
2025-05-19在當今數字化營銷時代,小紅書作為國內領先的社交電商平臺,其銷售數據蘊含著巨大的商業價值。通過對小紅書銷售數據的深入分析, ...
2025-05-16Excel作為最常用的數據分析工具,有沒有什么工具可以幫助我們快速地使用excel表格,只要輕松幾步甚至輸入幾項指令就能搞定呢? ...
2025-05-15數據,如同無形的燃料,驅動著現代社會的運轉。從全球互聯網用戶每天產生的2.5億TB數據,到制造業的傳感器、金融交易 ...
2025-05-15大數據是什么_數據分析師培訓 其實,現在的大數據指的并不僅僅是海量數據,更準確而言是對大數據分析的方法。傳統的數 ...
2025-05-14CDA持證人簡介: 萬木,CDA L1持證人,某電商中廠BI工程師 ,5年數據經驗1年BI內訓師,高級數據分析師,擁有豐富的行業經驗。 ...
2025-05-13CDA持證人簡介: 王明月 ,CDA 數據分析師二級持證人,2年數據產品工作經驗,管理學博士在讀。 學習入口:https://edu.cda.cn/g ...
2025-05-12CDA持證人簡介: 楊貞璽 ,CDA一級持證人,鄭州大學情報學碩士研究生,某上市公司數據分析師。 學習入口:https://edu.cda.cn/g ...
2025-05-09CDA持證人簡介 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度、美團、阿里等 ...
2025-05-07相信很多做數據分析的小伙伴,都接到過一些高階的數據分析需求,實現的過程需要用到一些數據獲取,數據清洗轉換,建模方法等,這 ...
2025-05-06以下的文章內容來源于劉靜老師的專欄,如果您想閱讀專欄《10大業務分析模型突破業務瓶頸》,點擊下方鏈接 https://edu.cda.cn/g ...
2025-04-30CDA持證人簡介: 邱立峰 CDA 數據分析師二級持證人,數字化轉型專家,數據治理專家,高級數據分析師,擁有豐富的行業經驗。 ...
2025-04-29CDA持證人簡介: 程靖 CDA會員大咖,暢銷書《小白學產品》作者,13年頂級互聯網公司產品經理相關經驗,曾在百度,美團,阿里等 ...
2025-04-28CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-27數據分析在當今信息時代發揮著重要作用。單因素方差分析(One-Way ANOVA)是一種關鍵的統計方法,用于比較三個或更多獨立樣本組 ...
2025-04-25CDA持證人簡介: 居瑜 ,CDA一級持證人國企財務經理,13年財務管理運營經驗,在數據分析就業和實踐經驗方面有著豐富的積累和經 ...
2025-04-25