9

对于 Python 和 Numpy 中的数组和列表,以下几行是等效的:

itemlist = []
for j in range(len(myarray)):
    item = myarray[j]
    itemlist.append(item)

和:

itemlist = []
for item in myarray:
    itemlist.append(item)

我对项目列表的顺序感兴趣。在我尝试过的几个示例中,它们是相同的,但是可以保证吗?例如,我知道foreachC# 中的语句不保证顺序,我应该小心使用它。

4

3 回答 3

10

是的,这是完全有保证的。 for item in myarray(其中myarray是一个序列,其中包括 numpy 的数组、内置列表、Python 的 array.arrays 等),实际上在 Python 中等同于:

_aux = 0
while _aux < len(myarray):
  item = myarray[_aux]
  ...etc...

对于一些幻像变量_aux;-)。顺便说一句,你的两个构造也等同于

itemlist = list(myarray)
于 2009-08-06T02:34:00.543 回答
10

保证列表。我认为与您的 C# 示例更相关的 Python 将是迭代字典中的键,这不能保证按任何顺序。

# Always prints 0-9 in order
a_list = [0,1,2,3,4,5,6,7,8,9]
for x in a_list:
    print x

# May or may not print 0-9 in order. Implementation dependent.
a_dict = {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}
for x in a_dict:
    print x

for <element> in <iterable>结构只担心iterable提供next()返回某些内容的函数。不能普遍保证这些元素在for..in语句域中以任何顺序返回;列表是一种特殊情况。

于 2009-08-06T03:17:50.567 回答
6

是的,Python 语言参考保证了这一点(重点是我的):

 for_stmt ::=  "for" target_list "in" expression_list ":" suite
               ["else" ":" suite]

“然后,该套件对迭代器提供的每个项目执行一次,按索引升序排列。”

于 2009-08-06T02:39:29.070 回答