Как я могу управлять фактическим объектом, а не копией, в цикле 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) 

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

Вот вам:

 # 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]