簡述python交換機制

2021-10-08 18:09:41 字數 2213 閱讀 1167

今天在刷《劍指offer》的時候,第一題中有用到乙個python的交換機制,大致**如下:

nums[i]

, nums[nums[i]],

= nums[nums[i]

], nums[i]

從**中不難看出,我的想法是將下標為i的元素的值與該元素值作為下標的元素的值進行交換,但上述**無法事先上述功能。首先上例子:

nums =

list

(range(5

))print

(nums)

nums[0]

, nums[1]

= nums[1]

, nums[0]

print

(nums)

nums[0]

, nums[nums[0]

]= nums[nums[0]

], nums[0]

print

(nums)

輸出結果:

[0,

1,2,

3,4]

[1,0

,2,3

,4][

1,0,

2,3,

4]

可以看出上述交換並沒有按照預想完成,那麼原因是什麼呢?

為了解決這個問題,我們需要首先簡單了解一下python的交換機制是個什麼樣的流程。

python在賦值操作的時候,因為是右值具有更高的計算優先順序,所以需要從右向左解析。

對於x, y = y, x,它的執行順序如下:

先計算右值y , x(這裡是簡單的原值,但可能會有表示式或者函式呼叫的計算過程), 在記憶體中建立元組(tuple),儲存y, x分別對應的值;

計算左邊的識別符號,元組被分別分配給左值,通過解包(unpacking),元組中第乙個標示符對應的值(y),分配給左邊第乙個標示符(x),元組中第二個標示符對應的值(x),分配給左邊第二個標示符(y),完成了x和y的值交換。

摘自部落格:

那麼基於以上流程,我們可以簡單分析一下該語句nums[0], nums[nums[0]] = nums[nums[0]], nums[0]的過程:

首先計算右邊的兩個值:nums[nums[0]] = 0, nums[0] = 1,所以原語句等價於:nums[0], nums[nums[0]] = 0, 1通過解包賦值:解包過程是乙個從左到右的過程,因此,首先執行語句:nums[0] = 0,接著,此時由於nums[0]已經被賦值為了0,此時,接著執行語句:nums[nums[0]] = 1等價於nums[0] = 1,所以此時nums[0]的值又再次被修改了回來,而從始至終nums[1]的值都沒有被修改過,因此,上述**無法實現預期功能。

那麼該如何實現上述功能呢?

從之前的分析中,我們不難得出,之所以無法實現上述功能的原因在於解包的過程中,索引值被先行修改了,那麼如果我們交換一下解包的先後順序呢?具體**如下:

nums =

list

(range(5

))print

(nums)

nums[0]

, nums[1]

= nums[1]

, nums[0]

print

(nums)

nums[0]

, nums[nums[0]

]= nums[nums[0]

], nums[0]

print

(nums)

nums[nums[0]

], nums[0]

= nums[0]

, nums[nums[0]

]# 修改解包順序

print

(nums)

輸出結果:

[0,

1,2,

3,4]

[1,0

,2,3

,4][

1,0,

2,3,

4][0

,1,2

,3,4

]

可以看出,我們實現了預期功能,也證明之前的推測是正確的,至此,較為妥善地解決了該問題。

[1]

交換機交換機

交換機。常常聽人說交換機 路由器。什麼是交換機?為什麼叫交換機?交換什麼?交換機是不是就是路由器?這二者有什麼區別?這是我的疑問。沒辦法,基礎沒打好。一 什麼是交換機 交換機是這麼一種裝置 將網路分成若干小段,以解決網路擁堵,降低出錯,提高傳輸效率。為什麼分成若干小段可以提高傳輸效率呢?這涉及到網路...

接入交換機,匯聚交換機,核心交換機

通常將網路中直接面向使用者連線或訪問網路的部分稱為接入層,將位於接入層和核心層之間的部分稱為分布層或匯聚層。接入交換機一般用於直接連線電腦,匯聚交換機一般用於樓宇間。匯聚相對於乙個區域性或重要的中轉站,核心相當於乙個出口或總彙總。原來定義的匯聚層的目的是為了減少核心的負擔,將本地資料交換機流量在本地...

交換機分布快取 核心交換機PK普通交換機

核心交換機我們平時提的挺多,那麼他與普通交換機到底有什麼區別的呢,今天我們一起來了解下。一 埠的區別 普通交換機埠數量一般為24 48個,網口大部分為千兆乙太網或者百兆乙太網口,主要功能用於接入使用者資料或者匯聚一些接入層的交換機資料,這種交換機最多可以配置vlan簡單路由協議和一些簡單的snmp等...