2013-03-17 3 views
1

Почему это происходит?Итерация для петли python

Версия 1:

mylist= [1,2,3,4,5] 
print mylist 
for index, value in enumerate(mylist): 
    value = 0 
print mylist 

Вариант 2:

mylist= [[1],[2],[3],[4],[5]] 
print mylist 
for index, value in enumerate(mylist): 
    value[0] = 0 
print mylist 

Выход 1:

[1, 2, 3, 4, 5] 
[1, 2, 3, 4, 5] 

Выход 2:

[[1], [2], [3], [4], [5]] 
[[0], [0], [0], [0], [0]] 

Я предположил, что обе версии будут создавать локальную переменную и не перезаписывать сам список. Наверное, это не так во второй версии. Я использую python 2.7. Ясно, что я могу иметь другую переменную внутри цикла for, которая создает другую копию значения. Мне просто потребовалось некоторое время, чтобы понять это, и это испортило мою функциональность кода.

Решение:

value = list(value) 
+3

[Рациональное улучшение вашего Python: понимание модели выполнения Python] (http://www.jeffknupp.com/blog/2013/02/14/drastically-improve-your-python-understanding-pythons-execution-model/) – delnan

ответ

4

Вы не приписывая value во втором варианте, вы назначаете на индекс, содержащийся в списке ссылается value.

Имена Python - это ссылки на значения, а не на ячейки памяти. Некоторые из этих значений изменяемы, например, список. Список содержит ссылки на другие значения, поэтому value - это список, а value[0] - это ссылка, содержащаяся в списке.

Чтобы изменить список в первом примере, используйте index из Перечислим для изменения этого индекса в списке:

for index, value in enumerate(somelist): 
    somelist[index] = 0 

Если вы сделали не хотите вложенные списки в вашем втором примере для изменения, вы должны сделать их копию вместо:

for index, value in enumerate(somelist): 
    value = value[:] # full list slice, same as a copy. 
+0

Итак, какой был бы лучший способ создать новую локальную переменную? Я попытался переназначить значение внутри второй версии для цикла, но он по-прежнему меняет значения в списке – Barmaley

+0

. Как мне обратиться, если я не хочу менять список? Я просто хочу временную локальную переменную, которая сохраняет значение значения (Извините за путаницу) – Barmaley

+1

@Barmaley Сделайте копию списка? 'value = list (value)' – Xymostech

0

Вот еще один вещий путь к локальной копии списка:

mylist= [[1],[2],[3],[4],[5]] 
print mylist 
mylst = [] 
for index, value in enumerate(mylist): 
    mylst += [[value[0]]] 
print mylst 
Смежные вопросы