1

Python v2.7 では、ループの本体でジェネレーターのソースである項目に副作用がforあるジェネレーターに関するステートメントに出くわしました。forfor

for ssid in (ssid for ssid in overlaps if ssid != subseq_id):
  overlaps = subseq_id_to_overlap_ssids_dict[ssid]

私の質問は、オーバーラップへの副作用がforジェネレーターに影響を与えることになっているかどうかです。そうでないことを願っていますが、もしそうなら、それは正確にはどういう意味ですか? 最初に一致する要素を処理し、現在は を置き換えたoverlaps場合、forインデックスは の新しい値の次の場所になりoverlapsますか?

4

2 に答える 2

3

ループ内での再バインドoverlapsはループに影響を与えません(ただし、ループを変更しても影響はありません)。ループ内でsubseq_iqを再バインドすると、ジェネレーターに影響を与える可能性があります。

ループは式を評価して、ループのfor開始時に1回イテレータを取得します。この場合、式は単に名前overlapsです。その式を評価すると、イテレータからイテレータを作成し、そのイテレータを使用して要素を処理します。イテレータは、式によって返されるオブジェクトに依存します。そのオブジェクトを識別するために使用される名前には依存しません(実際に名前がある場合)。

この特定のケースの場合、コードは次とまったく同じです。

for ssid in overlaps:
  if ssid != subseq_id:
     overlaps = subseq_id_to_overlap_ssids_dict[ssid]

これはそれを書くためのより明確な方法ですが、再びバインドoverlapsしても、によって使用されているシーケンスは変更されませんfor

于 2013-03-01T14:26:27.933 に答える
3

forループは、その引数を繰り返すことによって動作します。つまり、iterその引数を呼び出してイテレータを生成し、次にイテレータを呼び出すnextまで呼び出しますStopIteration

ジェネレータ内包表記の引数は、ループに入るoverlaps前にname-expression を評価するため、名前を再バインドしても効果はありません。参照するオブジェクトを変更すると、反復子がどのように過剰に動作するかに応じて、何らかの影響があります。たとえば、上のイテレータはインデックスをリストにインクリメントします。foroverlapsoverlapstype(overlaps)list

于 2013-03-01T14:31:51.433 に答える