for x in array' 是否总是返回排序后的 x?[Python/NumPy]

9 投票
3 回答
43178 浏览
提问于 2025-04-15 13:25

在Python和Numpy中,数组和列表的以下两行是等价的:

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

还有:

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

我对itemlist顺序很感兴趣。在我尝试的一些例子中,它们是一样的,但这能保证吗?比如,我知道C#中的foreach语句并不能保证顺序,所以我需要对此小心。

3 个回答

6

是的,Python语言参考保证了这一点(强调是我自己的):

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

“然后这个代码块会对迭代器提供的每一个项目执行一次,按照升序的顺序。”

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)
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语句的范围内会以任何特定的顺序返回;列表是一个特殊的情况。

撰写回答