2012-06-23 37 views
3

我想在Python中爲快速排序實現分區功能。爲什麼「i,j = 1」導致「int ..不可迭代」?

def partition(ls): 
    if len(ls) == 0: 
    return 
    pivot = ls[0] 
    i, j = 1 
    while j < len(ls): 
    if ls[j] <= pivot: 
     i += 1 
     temp = ls[i] 
     ls[i] = ls[j] 
     ls[j] = temp 
    j += 1 
    ls[0] = ls[i] 
    ls[i] = pivot 

但是,當我撥打quicksort.partition([1,2,3])時,Python會發出此錯誤。

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "quicksort.py", line 5, in partition 
    i, j = 1 
TypeError: 'int' object is not iterable 

這個錯誤說的是什麼?當然,int對象是不可迭代的,但是我什麼時候迭代過一個int對象?

+0

出於好奇,你爲什麼認爲'i,j = 1'要將兩個變量賦值爲1? –

+2

你有錯誤信息中有錯誤:'我,j = 1' – MartinHaTh

回答

10

當您列出在作業左側以逗號分隔的多個目標時,它會嘗試遍歷右側並將塊分配給左側的塊。所以如果你做x, y = (1, 2)那麼x將是1,y將是2.

如果你想讓我和j都是1,那麼做i = j = 1。 (請注意,這會將兩個變量綁定到同一個對象上,這種情況很好,但是如果您要分配可變對象(如x = y = []),則應該記住x和y都將指向相同的列表,這樣的突變將影響xy

+0

或'我,j = 1,1'。 –

3
i, j = 1 

這段代碼是(功能)等同於:

i = None 
for a in 1: 
    if i != None and j != None: 
     break 
    if i == None: 
     i = a 
    else 
     j = a 

哪個,當然,非法的,因爲1不是ITE rable,這就是口譯員告訴你的。

你想要的是:

i = j = 1 
+0

這沒有意義。爲什麼它測試'如果我== 0'? – BrenBarn

+0

@BrenBarn,nah,錯字。 – Griwes

+0

我不認爲這是一個有用的方式來看待它。 –

2
>>> i,j=1,2 
>>> i,j=[1,2] 
>>> i,j=(1,2) 
>>> i,j='12' 
>>> i,j={1,2} 
>>> i,j={'x':1,'y':1} 

工作正常,所有這些

所以i,j類型分配的工作只有在對=右側你要麼提供兩個逗號分隔值或具有兩個值的iterable

相關問題