9

PythonとNumpyの配列とリストの場合、次の行は同等です。

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

と:

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

アイテムリストの順番に興味があります。私が試したいくつかの例では、それらは同一ですが、それは保証されていますか?たとえばforeach、C#のステートメントは順序を保証するものではないため、注意が必要です。

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>ことだけを心配しています。これらの要素がステートメントのドメイン全体で任意の順序で返されるという一般的な保証はありません。リストは特殊なケースです。iterablenext()for..in

于 2009-08-06T03:17:50.567 に答える
6

はい、Python言語リファレンスはこれを保証します(強調は私のものです):

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

「その後、スイートは、インデックスの昇順で、イテレータによって提供されたアイテムごとに1回実行されます。」

于 2009-08-06T02:39:29.070 に答える