'for x in array'是否总是导致排序x?[Python的/ NumPy的]

Chr*_*ris 9 python arrays numpy list

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

itemlist = []
for j in range(len(myarray)):
    item = myarray[j]
    itemlist.append(item)
Run Code Online (Sandbox Code Playgroud)

和:

itemlist = []
for item in myarray:
    itemlist.append(item)
Run Code Online (Sandbox Code Playgroud)

我对itemlist 的顺序很感兴趣.在我尝试过的一些例子中,它们是相同的,但它是否有保证?例如,我知道foreachC#中的语句不保证顺序,我应该小心它.

Ale*_*lli 10

是的,它完全有保障. for item in myarray(在哪里myarray是一个序列,包括numpy的数组,内置列表,Python的array.arrays等),实际上在Python中等效于:

_aux = 0
while _aux < len(myarray):
  item = myarray[_aux]
  ...etc...
Run Code Online (Sandbox Code Playgroud)

对于一些幻像变量_aux;-).顺便说一句,你的两个结构也相当于

itemlist = list(myarray)
Run Code Online (Sandbox Code Playgroud)


Tri*_*ych 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
Run Code Online (Sandbox Code Playgroud)

for <element> in <iterable>结构只是担心,iterable用品next()返回一些功能.没有一般保证这些元素以任何顺序通过for..in语句域返回; 列表是一个特例.


ear*_*arl 6

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

 for_stmt ::=  "for" target_list "in" expression_list ":" suite
               ["else" ":" suite]
Run Code Online (Sandbox Code Playgroud)

"然后,按照升序索引的顺序,对迭代器提供的每个项执行一次该套件."