Ответ 1
Вы можете использовать понимание списка:
newArray = [i + 1 for i in array]
есть ли какой-либо эквивалент этой нотации PHP, который изменяет исходный массив (следует знать ссылочный оператор)?
// increase value of all items by 1
foreach ($array as $k => &$v) {
$v++;
}
Я знаю только этот способ, который не настолько изящен:
for i in range(len(array)):
array[i] += 1
Вы можете использовать понимание списка:
newArray = [i + 1 for i in array]
Когда встроенная функция enumerate()
вызывается в списке, она возвращает объект, который может быть итерирован, возвращая счетчик и значение, возвращаемое из списка.
for i, val in enumerate(array):
array[i] += 1
Относительно ссылок.
В 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]
Я не знаю, как получить указатель на элемент списка, но более чистый способ доступа по индексу демонстрируется http://effbot.org/zone/python-list.htm:
for index, object in enumerate(L):
L[index] = object+1