2017-02-15 15 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, значение counter.most_common() вычисляется" - какие языки сделать это? Я ничего не знаю. На каждом языке, который я знаю с циклом for-each, то, что вы зацикливаете, оценивается только один раз. – user2357112

+1

Или, короче: не путайте для каждого с циклами 'for' C-style. Все языки, для которых я знаю, для каждого цикла, оценивают итерацию один раз в начале. Разница, например, Итераторы Java - это '.most_common()' возвращает новый список, который не ссылается на исходный счетчик. – dhke

+1

Возможно, вы думаете о случаях, когда вы зацикливаете на ленивом объекте, который генерирует значения по мере необходимости, или вы можете ошибаться в эффектах мутирования коллекции для переоценки, но 'most_common' с нетерпением создает новый список, не зависящий от счетчика он был создан из. – user2357112

ответ

0

Нет, это не так. Более наглядный пример:

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

for x in example(): 
    print(x) 

Выход:

Ping 
1 
2 
3 
4