2015-07-03 35 views
3

我想解決一個問題。在嘗試更改列表值時,我觀察到一個奇怪的列表行爲。我無法更改列表元素的值。Python列表值不變

top = list(map(int, raw_input().split())) 
staff = list(map(int, raw_input().split())) 

ceo = top[0] 
coo = top[1] 
cto = top[2] 

top.extend(staff) 
alls = sorted(top) 
tot = len(alls) 
print(alls) 

alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2] 
print(alls) 

alls[0], alls[alls.index(coo)] = alls[alls.index(coo)], alls[0] 
alls[-1], alls[alls.index(cto)] = alls[alls.index(cto)], alls[-1] 

print(alls) 

這裏是程序的輸出:

輸入:

13 11 17 
12 10 

輸出

[10, 11, 12, 13, 17] 
[10, 11, 12, 13, 17] 
[10, 11, 12, 13, 17] 

爲什麼所有的列表值不改變?難道我做錯了什麼?

編輯: 問題聲明:https://www.hackerearth.com/codejunk/algorithm/steal-the-show/

我知道我的做法是不是解決這個問題的最好辦法,但我只是想知道爲什麼名單的值沒有改變?

+1

什麼是代碼應該是做什麼 –

+0

其正在進行的比賽的問題,因此不能鏈接的問題。反正它有關係嗎? –

+2

是的,它很重要,因爲你剛剛傾銷了一個代碼負載零解釋什麼應該發生什麼,爲什麼 –

回答

4

這裏的問題是您的操作員組合。我採取的第一個任務作爲例子,對它進行解剖:

alls[tot/2], alls[alls.index(ceo)] = alls[alls.index(ceo)], alls[tot/2] 

會發生什麼:

  1. CEO是在開始的時候13,所以alls.index(CEO)將在3時語句執行......但等待......這個任務在之前的時間

  2. 首先評估分配前的值。承滴盤[alls.index(CEO)]將13 - 難怪,因爲CEO是13.

  3. 承滴盤[TOT/2]將12,因爲TOT/2爲2(索引將是整數,所以逗號後面的部分將丟失)。

  4. 所以在右邊我們會得到(13,12)。

  5. 現在,分配給任務。 alls [tot/2]將首先被分配(但是你不能相信它,因爲這是實現細節!)。

  6. 所以所有[2]將是13!

  7. 現在,作業的第二部分.... alls.index(ceo)將是2 ....什麼?

的原因是,該承滴盤目前持有[10,11,13,13,17] ...和alls.index(CEO)將被評估並且它發現之前,在位置2發現13其他13位置3.

所以會發生什麼 - alls [2]將被分配12 - 該列表又回到了以前的內容。

的原因是,您使用聯合運營商和始終評估 子表達式新的不考慮,即子表達式 將在評估的過程中發生改變。

您可以通過將一些子表達式的結果賦值給 變量並使用它們來避免這種情況,從而使表達式變得複雜。 具體而言,應在表達式和 存儲在變量中之前評估可能在 主表達式內部更改的子表達式。

+2

具體來說,計算索引'tot/2'和'alls.index(ceo)',並在進行交換之前將它們存儲在變量中。 (第二個是有問題的。) –

+0

你說得對。我希望,很明顯,alls.index(首席執行官)是這裏的罪魁禍首。我想以某種方式來闡述它適用於其他類似的情況。 tot/2在這裏不是問題,因爲在這個過程中tot不會改變。 – Juergen

+0

是的,這更多的是OP的消息。我知道你明白了。 ;) –