Python交換值為何不用中間變量

所有代碼均來(lái)自于Python 2.7 版本

對(duì)于交換兩個(gè)值的操作,可能大多數(shù)之前不具備Python基礎(chǔ)的童鞋比較容易寫出以下代碼:

>>> tmp = x
>>> x = y
>>> y = tmp

顯然,這樣寫很不Pythonic,它的確可以工作,但稱不上簡(jiǎn)潔有效。

#在Python中更常見(jiàn)的寫法
>>> x, y = y, x

簡(jiǎn)潔性可以一目了然,那效率又如何呢?

>>> from timeit import Timer
>>> Timer('tmp = x;x = y;y = tmp','x = 2; y = 4').time()
0.0300285  #根據(jù)運(yùn)行環(huán)境不同,結(jié)果可能會(huì)有差異
>>> Timer('x, y = y, x', 'x = 2; y = 4').timeit()
0.0265907

雖然差距不大,但是還是有一點(diǎn)點(diǎn)差距的。(差距不明顯是因?yàn)橹皇且粋€(gè)簡(jiǎn)單的賦值語(yǔ)句,加上計(jì)算機(jī)的計(jì)算速度與日俱增)

那么,在x, y = y, x的背后都發(fā)生了些什么呢?

一般情況下Python語(yǔ)句是從左到右解析一個(gè)語(yǔ)句的,但在賦值操作的時(shí)候,因?yàn)槭怯抑稻哂懈叩挠?jì)算優(yōu)先級(jí),所以需要從右向左解析。
對(duì)于x, y = y, x,它的執(zhí)行順序如下:

  1. 先計(jì)算右值y , x(這里是簡(jiǎn)單的原值,但可能會(huì)有表達(dá)式或者函數(shù)調(diào)用的計(jì)算過(guò)程), 在內(nèi)存中創(chuàng)建元組(tuple),存儲(chǔ)y, x分別對(duì)應(yīng)的值;
  2. 計(jì)算左邊的標(biāo)識(shí)符,元組被分別分配給左值,通過(guò)解包(unpacking),元組中第一個(gè)標(biāo)示符對(duì)應(yīng)的值(y),分配給左邊第一個(gè)標(biāo)示符(x),元組中第二個(gè)標(biāo)示符對(duì)應(yīng)的值(x),分配給左邊第二個(gè)標(biāo)示符(y),完成了xy的值交換。
    需要注意的是當(dāng)左右值和標(biāo)識(shí)符的數(shù)量不等時(shí)會(huì)出現(xiàn)ValueError:
>>> x, y = 1, 2
>>> x, z = y, x, 3
ValueError: too many values to unpack
>>> y, x , a= x, y
ValueError: need more than 2 values to unpack

而當(dāng)左值只有一個(gè)變量的時(shí)候,默認(rèn)將右值打包(pack)成一個(gè)元組(tuple)傳給右值。

>>> x = 1, 2
>>> x
(1, 2)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 最近在慕課網(wǎng)學(xué)習(xí)廖雪峰老師的Python進(jìn)階課程,做筆記總結(jié)一下重點(diǎn)。 基本變量及其類型 變量 在Python中,...
    victorsungo閱讀 1,976評(píng)論 0 5
  • Python簡(jiǎn)介 Python歷史 Python 是由 Guido van Rossum 在八十年代末和九十年代初...
    莫名其妙的一生閱讀 1,150評(píng)論 0 2
  • 一、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序...
    績(jī)重KF閱讀 2,039評(píng)論 0 1
  • 具體的使用方法可以參照官方文檔:https://www.npmjs.com/package/node-inspec...
    夢(mèng)想成真213閱讀 1,891評(píng)論 0 0
  • 本節(jié)重點(diǎn):四大核心鑄商業(yè) 提問(wèn)1:什么是商業(yè)呢? 一句話,商業(yè)是與產(chǎn)品或者服務(wù)的生產(chǎn)購(gòu)買或者銷售相關(guān)的工作。 展開(kāi)...
    閑月三星閱讀 441評(píng)論 0 1

友情鏈接更多精彩內(nèi)容