“for x in range(3): print x”保证按照顺序打印“0, 1, 2”吗?

3

以下是一个循环的形式

for x in range(3):
    print x

保证输出结果

0
1
2

按照顺序吗?换句话说,如果您使用for item in mylist语句循环遍历列表,循环是否保证从mylist[0]开始,并顺序进行(mylist[1]mylist[2],...)?


2
一个自定义对象可以定义自己奇怪的迭代顺序,但对于 range 和内置的 list 来说,它将是有序的。 - Tim
7个回答

6
是的,内置的listrange总是按您预期的顺序进行迭代。类定义其自己的迭代顺序,因此迭代顺序将在不同的类之间变化。由于它们的本质,setdict(以及其他一些)不会按可预测的顺序进行迭代。
您可以为类定义任何迭代序列。例如,您可以创建一个将反向迭代的list
class reversedlist(list):
    def __iter__(self):
        self.current = len(self)
        return self

    def next(self):
        if self.current <= 0:
            raise StopIteration
        self.current -= 1
        return self[self.current]

x = reversedlist([0, 1, 2, 3, 4, 5])
for i in x:
    print i,
# Outputs 5 4 3 2 1 0

5
是的,它确实是。但并不是for循环保证顺序,而是range函数。range(3)会给您返回一个迭代器,其依次返回0、1和2。迭代器只能逐个访问元素,因此这是for循环可以访问元素的唯一顺序。
其他迭代器(例如未由range函数生成的迭代器)可能以其他顺序返回元素。
当使用for循环时,列表被用作迭代器。也就是说,for循环实际上没有对其进行索引。它只是不断调用next函数,直到没有更多元素。通过这种方式,for循环本身无法决定处理元素的顺序。

2
"range(3) gives you an iterator" 的意思是,当使用Python2时,range函数返回一个列表。 - Steve Jessop

3

是的,它是可以的。

像这样的Python for循环:

for e in list:
    print e

可以翻译为:

iterator = list.__iter__()
while True:
    try:
        e = iterator.next()
    except StopIteration:
        break
    print e

因此,对象迭代器的“下一个”方法按“正确”的顺序返回值,您将按照“正确”的顺序获取元素。对于Python列表,这是有保证的。
要了解更多信息,请查看这里这里

1
是的。Python中的for循环按顺序遍历listiter。在Python 2.x中,range返回列表,在Python 3.x中返回迭代器,因此您的for x in range(3)循环确实总是有序的。
然而,对于dictset不能这样说。它们不会按顺序遍历 - 这是因为它们的键的顺序是未定义的。

0

是的,它从列表的第一个元素开始并遍历到最后一个元素。

并非Python中的所有数据类型都是如此,例如字典,但列表确实是这样的。range(x)也是如此。


0

是的。

但是使用字典就无法保证顺序。


0

是的。Python关于For Loop的文档说:

基本上,任何具有可迭代方法的对象都可以在Python中的for循环中使用... 具有可迭代方法基本上意味着数据可以以列表形式呈现,其中有多个值按顺序排列


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接