По поводу ссылок.
В 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]