python присваивает значения элементам списка в цикле

Является ли это действительным поведение python? Я думаю, что конечный результат должен быть [0,0,0], а функция id () должна возвращать одинаковые значения каждой итерации. Как сделать это pythonic, а не использовать перечисление или диапазон (len (bar))?

bar = [1,2,3] print bar for foo in bar: print id (foo) foo=0 print id(foo) print bar 

вывод:

 [1, 2, 3] 5169664 5169676 5169652 5169676 5169640 5169676 [1, 2, 3] 

4 Solutions collect form web for “python присваивает значения элементам списка в цикле”

Прежде всего, вы не можете переназначить переменную цикла – ну, вы можете, но это не изменит список, который вы повторяете. Поэтому установка foo = 0 не изменит список, а только локальную переменную foo (которая, как оказалось, содержит значение для итерации в начале каждой итерации).

Далее, небольшие числа, такие как 0 и 1 , внутренне хранятся в пуле небольших целых объектов (это деталь реализации CPython, это не обязательно!) Вот почему идентификатор для foo одинаковый после того, как вы назначили 0 к нему. Идентификатор – это в основном идентификатор этого целочисленного объекта 0 в пуле.

Если вы хотите изменить свой список во время итерации по нему, вам, к сожалению, придется обращаться к элементам по индексу. Поэтому, если вы хотите сохранить вывод таким же, но в конце [0, 0, 0] , вам придется перебирать индексы:

 for i in range(len(bar)): print id(bar[i]) bar[i] = 0 print id(bar[i]) print bar 

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

Да, вы получили обычное поведение Python. Присвоение нового значения foo изменит идентификатор foo и не изменит значения, сохраненные в bar .

Если вам нужен список нулей, вы можете сделать:

 bar = [0] * len(bar) 

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

 bar = [x * 2 for x in bar] 

Или вы можете использовать map :

 def double(x): return x * 2 bar = map(double, bar) 

вы на самом деле не изменили список вообще. первая вещь для цикла – это присвоить bar [0] foo (эквивалентно foo = bar [0]). foo – это просто ссылка на 1. Затем вы назначаете другой onject 0 в foo. Это изменило ссылку foo на 0. Но вы не изменили бар [0]. Помните, что foo как переменная, reference bar [0], но назначить другое значение / object для foo не влияет на bar [0] вообще.

 bar = [0 for x in bar] 

Длинный ответ: foo – это просто локальное имя, а переупорядочение не влияет на список. Переменные Python на самом деле являются просто ключами: парами значений, а не символическими именами для мест памяти.

  • Python проверяет экземпляры классов
  • Почему переменная экземпляра ведет себя как переменная класса в Python?
  • Получить атрибуты для класса и экземпляра в python
  • Получение имени класса экземпляра в Python
  • как убить витые экземпляры протокола python
  • SQLAlchemy: изменение отдельного объекта
  • Как получить доступ к «себе» в рамках класса?
  • Почему type (classInstance) возвращает экземпляр?
  • Когда использовать Singleton в python?
  • Удаленный объект Python
  • Как избежать нескольких экземпляров программы?
  •  
    Interesting Posts for Van-Lav

    не удалось установить графический инструмент в Windows 7

    Как отправить массив с помощью request.post (Python)? «Ошибка значения: слишком много значений для распаковки»

    Создать довольно diff html в Python

    Как избежать обработки пустого stdin с помощью python?

    Какие специальные методы обходят __getattribute__ в Python?

    простое чтение двоичных данных fortran не так просто в python

    Простая анимация 2D-координат с использованием matplotlib и pyplot

    Доступ к моделям Django с помощью scrapy: определение пути к проекту Django

    Selenium webdriver + Процессы PhantomJS не закрываются

    как преобразовать этот вложенный JSON в столбчатой ​​форме в рамку данных Pandas

    Объединение массива с использованием Python и NumPy

    Эффективное определение того, открыт ли бизнес или нет на основе часов магазина

    захват кадра NTSCtoUSB ключ, opencv2, оболочка python

    QWidget :: setLayout: Попытка установить QLayout "" на MainWindow "", который уже имеет макет

    Устранение неполадок reportlab heisenbug

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