3

我正在尝试在 Python 中实现快速排序的分区函数。

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]).

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

4

3 回答 3

10

当您在作业左侧列出多个用逗号分隔的目标时,它会尝试遍历右侧并将片段分配给左侧的片段。因此,如果您这样做,x, y = (1, 2)则 x 将为 1,y 将为 2。

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

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

于 2012-06-23T19:31:12.527 回答
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
于 2012-06-23T19:33:21.493 回答
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具有两个值的 an 时,分配类型才有效。

于 2012-06-23T19:42:20.530 回答