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' , но это не …

 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 Bool и int сравнение и индексирование в списке с булевыми значениями
  • Неожиданное поведение Extend со списком в Python
  • Извлечение слов из строки, удаление знаков препинания и возврат списка с выделенными словами в Python
  • Базовые индексирующие рекурсии подстроки в строке (python)
  • Сделать словарь из списка с помощью python
  • Python: Получить список из списка
  • Сортировка файлов по дате
  • Как сделать полностью нераскрытую копию сложного списка? (Глубокой копии недостаточно)
  • 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 - лучший язык программирования в мире.