python, 交換列表中的兩個值遇到的坑

2021-10-05 20:19:39 字數 1469 閱讀 7815

python中交換兩個值有種很方便的用法,如下

a, b = b, a
對於兩側都只有2或3個值的時候,它是通過棧stack來操作的

>>

>

import dis

>>

>

deffoo

(a, b):.

.. a, b = b, a..

.>>

> dis.dis(foo)

20 load_fast 1

(b)3 load_fast 0

(a)6 rot_two

7 store_fast 0

(a)10 store_fast 1

(b)13 load_const 0

(none

)16 return_value

先把右側的b, a放進棧裡面(load_fast),那麼根據棧先進後出的特性,會變成[a, b],然後通過rot_two把兩個值反轉變成[b, a]。第乙個store_fast會先pop出b出來返回給a,然後第二個store_fast把後面的a給pop出來給b,操作完成。

旋轉rot_two(rotate)的目的其實就是保證等號左側的賦值順序是從左到右的。

ok,現在開始講乙個坑了。

nums =[1

,2,3

,4,5

,6,7

]nums[1]

, nums[nums[1]

]= nums[nums[1]

], nums[1]

# 下意識會覺得將獲得 [1, 3, 2, 4, 5, 6, 7]

print

(nums)

下意識會覺得將獲得 [1, 3, 2, 4, 5, 6, 7],然鵝答案是…

[1,

3,3,

2,5,

6,7]

wtf ???

仔細思考後,發現是因為賦值是從左側開始的,也就是說是nums[1]先被賦值。但是nums[1]被賦值後,後面的nums[nums[1]]中的nums[1]已經不是我們原來期待的了。

那麼,把nums[1]和nums[nums[1]]的賦值順序換一下就好了

nums =[1

,2,3

,4,5

,6,7

]nums[nums[1]

], nums[1]

= nums[1]

, nums[nums[1]

]print

(nums)

[1,

3,2,

4,5,

6,7]

python交換兩個變數的值

大部分語言,例如c語言,交換兩個變數的值需要使用中間變數。例如交換a,b 偽 tmp a a b b tmp python裡面可以實現無臨時變數的交換 a,b b,a 對於它的交換原理我深感好奇,因為這意味著python直譯器很有可能做了件更多的工作。如果說變數可以直接交換,那麼列表的元素呢?lis...

交換兩個變數的值

交換兩個變數的值 交換兩個變數的值是我們學習c語言常見的問題,通常我們採取的方式是定義中間變數,通過中間變數交換這兩個變數值。1 直接在主函式裡完成 int a 2,b 3 int t t a a b b t 2 通過定義swap 完成交換,其中可以通過引用 位址傳遞完成變數值交換 引用 inclu...

交換兩個變數的值

有兩個整數a和b,下面將用四種方法把他們的值進行交換 方法1 借助臨時變數tmp include intmain 如果要求不能建立其他變數,還有下面的方法 方法2 巧妙進行數值運算 include intmain 方法3 二進位制異或運算 include intmain 整數10的二進位制數表示為 ...