Python: элементы списка не изменяются в цикле for

Я был потрясен, когда следующий код не сделал того, что я ожидал от него:

lines_list = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n'] for line in lines_list: line = line.strip() 

Я, конечно, ожидал, что каждый элемент в списке станет "stripped" , то есть в этом случае, чтобы быть свободным от хвоста '\n' , но это не …

  • Зацикливание меню опций меню selenium в python
  • Запуск цикла вместе с приложением Tkinter
  • python: перезапуск цикла
  • Эквивалент Python для Haskell's (для индексации списка)
  • Цикл tkinter и последовательная запись
  • Сохранение фигур в петле
  •  print lines_list 

    Выход:

     ['this is line 1\n', 'this is line 2\n', 'this is line 3\n'] 

    Как вы можете догадаться, мой вопрос в том, есть ли элегантный способ изменить элементы списка во время цикла for ? Я не хочу дублировать список …

    EDIT :

    Я хотел бы упомянуть, что, кстати, в Perl или Java , мое использование работает хорошо. Python – это тот, у кого уникальное поведение

    В Java это будет работать:

     String[] lines = {"this is line 1\n", "this is line 2\n", "this is line 3\n"}; for (String line : lines) { line = line.trim(); } 

    В Perl это будет работать:

     my @lines = ("this is line 1\n", "this is line 2\n", "this is line 3\n"); foreach my $line (@lines) { $line =~ s/\s+$//; $line =~ s/^\s+//; } 

  • Как повторить раздел программы, пока вход не будет корректным в python?
  • Python - способ перезапуска цикла for, аналогичный «продолжить» для циклов while?
  • Сохранение вывода для цикла в файл
  • Как сравнить список списков / наборов в python?
  • петля над 2 списками, повторяя кратчайший до конца самого длинного
  • разбить два на циклы
  • 3 Solutions collect form web for “Python: элементы списка не изменяются в цикле for”

    Вы можете пройти по индексу и изменить таким образом

     for i, _ in enumerate(lines_list): lines_list[i] = lines_list[i].strip() 

    хотя я думаю, что многие предпочли бы простоту дублирования списка, если список не настолько велик, что он вызывает проблему

     lines_list = [line.strip() for line in lines_list] 

    Проблема заключается в том, что оператор = переназначает оператор в переменную line , он не делает ничего, чтобы повлиять на содержимое исходной строки. Новые программисты на Python одинаково часто удивляются, когда:

     for i in range(10): print(i) i += 1 

    печатает цифры 0,1,2,3,4,5,6,7,8,9. Это происходит потому, что цикл for переназначает i в начале каждой итерации на следующий элемент в диапазоне. Это не совсем ваша проблема, но это похоже.

    Так как вы читаете строки из файла и затем лишаете их, действительно, что вы должны делать, это

     with open(file_name) as f: lines_list = [line.strip() for line in f] 

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

    Вы забыли присвоить новое значение (разделив строку).

    Другой способ, как назначить его в список короче:

     >>> lst = ['this is line 1\n', 'this is line 2\n', 'this is line 3\n'] >>> import string >>> lst = map(string.strip, lst) >>> lst ['this is line 1', 'this is line 2', 'this is line 3] 

    В вашем примере line – это просто переменная. Он не связан со списком, откуда он может произойти. Подумайте о проблемах, которые произойдут, если каждая переменная изменяет ее происхождение!

    В python списки обычно не изменяются, но создается новый. Поэтому есть нечто, называемое пониманием списка:

     lines_list = [line.strip() for line in lines_list] 
    Python - лучший язык программирования в мире.