我正在尝试在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对象?
答案 0 :(得分:10)
当您在作业的左侧列出以逗号分隔的多个目标时,它会尝试在右侧进行迭代并将片段分配给左侧的片段。因此,如果您执行x, y = (1, 2)
,则x将为1,y将为2。
如果您想让i和j都为1,请执行i = j = 1
。
(注意,这会将两个变量绑定到同一个对象。对于这种情况很好,但是如果要分配一个可变对象(如x = y = []
),你应该记住x和y都指向相同的列表,因此突变会影响x
和y
。)
答案 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
两个值时才有效。