2016-12-10 5 views
2

ですか?どのように変数自体を変更しても、反復変数は常に元のシーケンスに従うでしょうか?Python:ループ内の反復変数を変更するのは安全ですか?

docにはこれについては何も言及していません。

私は他のところで同様の質問を見たことがありますが、どれも正式な回答を得ていません。私は100回テストしましたが、100回働いたが、これが保証されているかどうかまだ分かりません。だからを参照してください。

+0

変数を変更しても、コードには影響しません。しかし、新しい変数を使用するときれいです。 –

+0

@Atirag注意深く見てください。私はシーケンスを変更するのではなく、反復変数を変更しています。 – Cyker

+0

@atirag誰が言ってるの? – Gribouillis

答えて

4

はい。 forループ内のループ変数に割り当てるのは完全に安全です。 The for statementドキュメントから

ザ・forループは、ターゲットリストの変数(S)への割り当てを行います。 これは 含むこれらの変数のすべての以前の割り当てのスイートで作製されたものを上書きするためのループ:

for i in range(10): 
    print(i) 
    i = 5    # this will not affect the for-loop 
         # because i will be overwritten with the next 
         # index in the range 

この情報は、元のシーケンスを使用するhelp('for')

+0

ループ変数に*を割り当てることは安全ですが、変更可能な場合は変更するとシーケンスに影響を与える可能性があります。 – Stuart

+0

@Stuart確かに、それはあなたの答えのジェネレータのような奇妙な反復可能性がない限り、通常はループ変数がとる後続の値に影響しません。 –

0

私は構文

for item in stuff: 
    ... 

は、値がそのイテレータにnext()を呼び出すことによって抽出され、iter(stuff)を呼び出すことによってイテレータを作成します。考えます

-1

短い答えは、それはそれはあなたがsafeによって何を意味するのかに依存

....左右される。技術的には、反復に使用する変数を変更することは間違いありません。リストや何かを反復処理するときは、実際にイテレータを反復処理しています。

イテレータから返される変数を変更する場合は、変更しようとしているオブジェクトの変更可能性に注意する必要があります。

整数または文字列を繰り返し処理する場合、実際にはvariableは変更されませんが、変数名に新しい値が設定されます。したがって、コンテナに含まれる値は変更されません。

しかし、変更可能なオブジェクトを持つコンテナを反復処理している場合(dictsと言う)、内容を変更して変数を変更すると、コンテナに含まれる値は同じ値になります。

a = [{}, {}, {}] 
for x in a: 
    x = {'val': x} 

しかし、あなたは、変数名が指す値を修正するが、これに変更していないとして、このような何かをやってすることは、容器内の値に全く影響を与えないだろうが、変数名のポイントを重視しますこのだろうが

a = [{}, {}, {}] 
for x in a: 
    x['v'] = 1 
+1

下垂体を説明するのに気をつけますか? –

1

ループを介して利用可能であり、

a = [1, 2,3 ] 
for index,number in enumerate(a): 
    print(a[index]) 
    index = 0 
    number = 0 

出力:

例えば
2

私はPM 2Ringの答えに同意しますが、ループが「元のシーケンスに従う」ことが保証されているかどうか尋ねます。ジェネレータ関数によって定義されるイテレータについては、イテレータ間でシーケンスが変更される可能性があるため、これは保証されません。シーケンス内の変更可能な要素を変更することによってジェネレータが動作する方法を変更することが可能です。例えば

def strange_iter(): 
    x = {'value': 1} 
    while x['value'] < 30: 
     x = {'value': x['value'] + 1} 
     yield x 

for d in strange_iter(): 
    print(d['value']) 
    if d['value'] == 10: 
     d['value'] = 15  # loop will skip from 10 to 16 

私は、このような発電機は実際にどんな用途を持っているかどうかわからないか、最高の悪い習慣を回避していると考えられます。

関連する問題