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的二進位制數表示為 ...