2014-09-25 3 views
-2

Просто заметил что-то, когда я был мутирует список в Python:Минимальное видоизменение список в Python 2.7

my_list = ['a','b','c','d','e'] 

Пример 1

for letter in my_list: 
    if letter == 'c': 
     letter = 'x' 

Пример 2

for i in range(len(my_list)): 
    if my_list[i] == 'c': 
     my_list[i] = 'x' 

Результат 1

my_list = ['a','b','c','d','e'] 

Результат 2

my_list = ['a','b','x','d','e'] 

Так мой вопрос это буква не прямая ссылка на элемент в «my_list»? В чем разница между двумя контурами?

+2

Ваш второй пример не имеет смысла. Отправьте свой реальный код. – Matthias

+0

Разница в том, что ваш второй цикл не должен отображать ничего, поскольку буква не существует. – 2014-09-25 09:00:37

+0

Что такое 'a, b, c, d, e'? эти строки? и у вас также есть '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '. –

ответ

0

Предполагая, что его my_list[i] вместо letter в примере 2

В примере 1, когда вы делаете for letter in my_list, Python итерацию по списку и сохраняет значение в переменной letter. Поэтому, как и говорить letter = my_list[i]. Теперь вы можете сравнить letter, но смена letter не будет обновлять значение в my_list, так как letter - это только копия элемента списка.

+0

Да, я изменил второй пример. Итак, буква - это отдельная переменная, а не ссылка. Спасибо – Tomy

+0

да его просто односторонняя привязка, а не двусторонняя – hyades

0

В примере 1 буква представляет собой простую переменную, которая поочередно принимает значение каждого элемента списка. Изменение этого не влияет на список вообще. Думаю, в примере 2 «письмо» следует заменить на «list [i]». В этом случае список изменяется.

Как я хотел бы написать это:

my_list = ["x" if letter == "c" else letter for letter in my_list] 
+0

дополнительная память! – hyades

+0

@hyades: Во время обработки мне все равно, если списки достаточно малы. Впоследствии нет никакой разницы (только новый список сохранился), так что вы имеете в виду? – guidot

+1

@hyades Это правда, что мы выбрасываем первый список. Но это питонический способ решения этого. Если бы я увидел код, подобный второму примеру в производственном проекте, я бы попросил их изменить его, чтобы перечислить понимание, как \ @guidot, предлагаемое здесь. Чтобы решить проблему с памятью, я, вероятно, попытаюсь избавиться от первого списка, если это возможно (изменив его на итератор.), Поэтому первый список не будет существовать в первую очередь. Кроме того, списки python не являются массивами, поэтому обновление на месте не будет работать так хорошо, как вы ожидаете от них. – yilmazhuseyin

Смежные вопросы