Как я могу управлять фактическим объектом, а не копией, в цикле python?

скажем, у меня есть список

a = [1,2,3] 

Я хотел бы увеличить каждый элемент этого списка. Я хочу сделать что-то синтаксически просто, как

 for item in a: item += 1 

но в этом примере python использует только значение item , а не его фактическую ссылку, поэтому, когда я закончил с этим циклом, все равно возвращает [1,2,3] вместо [2,3,4]. Я знаю, что могу сделать что-то вроде

 a = map(lambda x:x+1, a) 

но это действительно не вписывается в мой текущий код, и мне бы не хотелось переписывать его: – \

3 Solutions collect form web for “Как я могу управлять фактическим объектом, а не копией, в цикле python?”

Вот вам:

 # Your for loop should be rewritten as follows: for index in xrange(len(a)): a[index] += 1 

Кстати, элемент IS является ссылкой на item в a , но, конечно, вы не можете назначить новое значение целому числу. Для любого изменяемого типа ваш код будет работать нормально:

 >>> a = [[1], [2], [3], [4]] >>> for item in a: item += [1] >>> a [[1,1], [2,1], [3,1], [4,1]] 

В целых числах python (и поплавках, и строках, и кортежах) неизменяемы, поэтому у вас есть фактический объект (а не копия), вы просто не можете его изменить.

Что происходит в строке: item += 1 вы создаете новое целое число (со значением item + 1 ) и привязываете к нему item имени.

То, что вы хотите сделать, – это изменить целое число, на которое указывает a[index] за чего работает строка a[index] += 1 . Вы по-прежнему создаете новое целое число, но затем вы обновляете список, чтобы указать на него.

В качестве примечания:

 for index,item in enumerate(a): a[index] = item + 1 

… немного более идиоматично, чем ответ, отправленный Триптихом.

Вместо решения на основе map , вот решение на основе списка

 a = [item + 1 for item in a] 
  • Как выполнить время выполнения скриптов в PyCharm без добавления кода каждый раз?
  • Как вычислить время выполнения из состояния и времени с помощью python
  • Проблема с Python - нет теста?
  • Причина неинтуитивного поведения UnboundLocalError
  • Python для создания ndarray из списка для перехода к SVM и ValueError: установка элемента массива с последовательностью
  • ImportError: PyCapsule_Import не смог импортировать модуль "pyexpat"
  • Как загрузить html-документацию, сгенерированную с помощью sphinx в github?
  • Лучший способ «очистить» html-текст
  • Python - лучший язык программирования в мире.