今天在刷《劍指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等...