Foreach на Python не работает должным образом

Я хочу переключать каждый второй элемент списка:

s = [False] * 5 for item in s[::2]: item = not item print(s) 

Но это не сработает.

 [False, False, False, False, False] 

Это, однако, работает так, как ожидалось:

 for i in range(0, len(s), 2): s[i] = not s[i] print(s) [True, False, True, False, True] 

Почему это происходит?

3 Solutions collect form web for “Foreach на Python не работает должным образом”

Потому что, когда вы это делаете

 item = not item 

То, что вы на самом деле делаете, – это изменить ссылку на объект в массиве с другой ссылкой на объект вне массива. item – это просто копия ссылки на объект внутри массива.

Второй код работает так, как ожидалось, потому что он меняет ссылку в самом массиве, а не в исходной копии.

Эти строки:

 for item in s[::2]: item = not item 

эквивалентны этому:

 for i in range(0, len(s), 2): item = s[i] item = not item 

В первом случае вы назначаете переменную, созданную во время цикла. Во втором вы назначаете индекс в массиве. Каждая итерация цикла сбрасывает item переменной.

    Python - лучший язык программирования в мире.