2017-02-15 5 views
0
counter = Counter() 
// fill data into counter 
for a, b in counter.most_common(): 
    if (b > 1): 
     counter[a] = np.log(b) 
    else: 
     counter[a] = -np.log((1/(b+0.01))) 

私の知る限り、これは私の試練に基づいて安全です。私が列挙している間にコレクションを変更すると、悪いことは起こりません。他の言語では、forの各サイクルで、counter.most_common()の値が評価されます。コレクションを変更する列挙中にカウンタ?

これはPythonでも起こりませんか?

+2

- それは何の言語のですか?私は何も知らない。私がfor-eachループで知っているすべての言語で、ループしているものは一度だけ評価されます。 – user2357112

+1

あるいは、短くてfor-eachをCスタイルの 'for'ループと混同しないでください。私が知っているfor-each-loopを持つすべての言語は、開始時に1回iterableを評価します。例えば、 Javaイテレータは、 '.most_common()'が元のカウンタを参照しない新鮮なリストを返すということです。 – dhke

+1

必要に応じて値を生成する遅延オブジェクトをループしている場合や、コレクションを変更する効果を間違えて再評価することが考えられるかもしれませんが、 'most_common'はカウンタから独立した新しいリストを熱心に作成しますそれはから作成されました。 – user2357112

答えて

0

いいえ、そうではありません。もっと説明的な例:

def example(): 
    print("Ping") 
    return [1,2,3,4] 

for x in example(): 
    print(x) 

出力:

「counter.most_common()値が評価されるための各サイクルにおける他の言語では、」
Ping 
1 
2 
3 
4 
関連する問題