Python эквивалент foreach для php ($ array as $ key => & $ value) - PullRequest
29 голосов
/ 02 мая 2011

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

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

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

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

Ответы [ 4 ]

50 голосов
/ 02 мая 2011

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

for i, val in enumerate(array):
    array[i] += 1
5 голосов
/ 02 мая 2011

Вы можете использовать понимание списка :

newArray = [i + 1 for i in array]
2 голосов
/ 02 мая 2011

По поводу ссылок.

В 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]
1 голос
/ 02 мая 2011

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

for index, object in enumerate(L):
    L[index] = object+1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...