为什么“i,j = 1”导致“int ..不可迭代”?

时间:2012-06-23 19:29:32

标签: python

我正在尝试在Python中为quicksort实现分区函数。

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对象?

3 个答案:

答案 0 :(得分:10)

当您在作业的左侧列出以逗号分隔的多个目标时,它会尝试在右侧进行迭代并将片段分配给左侧的片段。因此,如果您执行x, y = (1, 2),则x将为1,y将为2。

如果您想让i和j都为1,请执行i = j = 1

(注意,这会将两个变量绑定到同一个对象。对于这种情况很好,但是如果要分配一个可变对象(如x = y = []),你应该记住x和y都指向相同的列表,因此突变会影响xy。)

答案 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不可迭代,而这就是解释者告诉你的。

你想要的是:

i = j = 1

答案 2 :(得分: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两个值时才有效。