Подтвердить что ты не робот

Эквивалент Python для php foreach ($ array as $key => & $value)

есть ли какой-либо эквивалент этой нотации PHP, который изменяет исходный массив (следует знать ссылочный оператор)?

// increase value of all items by 1
foreach ($array as $k => &$v) {
    $v++;
}

Я знаю только этот способ, который не настолько изящен:

for i in range(len(array)):
    array[i] += 1 
4b9b3361

Ответ 2

Когда встроенная функция enumerate() вызывается в списке, она возвращает объект, который может быть итерирован, возвращая счетчик и значение, возвращаемое из списка.

for i, val in enumerate(array):
    array[i] += 1

Ответ 3

Относительно ссылок.

В python каждое значение является объектом, и каждая "переменная" является ссылкой на объект. Присвоение никогда не копирует значение, оно всегда присваивает ссылку.

Таким образом, v в for k,v in enumerate([1,2,3]) также является ссылкой. Однако большинство объектов базовых "типов" неизменяемы, поэтому, когда вы делаете immutable_object_reference += 1, вы создаете новый экземпляр int и изменяете immutable_object_reference, чтобы указать на новый экземпляр.

Когда наши значения имеют изменяемые типы, ссылки работают так же, как и в PHP:

>>> class mutable_pseudoint(object):
...     def __init__(self, d):
...         self.d = d
...     def __iadd__(self, v):
...         self.d += v
...     def __repr__(self):
...         return self.d.__repr__()
...     def __str__(self):
...         return self.d.__str__()
... 
>>> l = [mutable_pseudoint(1), mutable_pseudoint(2), mutable_pseudoint(3), mutable_pseudoint(4)]
>>> l
[1, 2, 3, 4]
>>> for k,v in enumerate(l):
...     v += 1
... 
>>> l
[2, 3, 4, 5]

Ответ 4

Я не знаю, как получить указатель на элемент списка, но более чистый способ доступа по индексу демонстрируется http://effbot.org/zone/python-list.htm:

for index, object in enumerate(L):
    L[index] = object+1