Python передает целочисленные значения по ссылке в лямбда-выражениях [дубликат] ⇐ Python

Программы на Python
Anonymous
Python передает целочисленные значения по ссылке в лямбда-выражениях [дубликат]

Сообщение Anonymous »

Я пытаюсь понять, какой смысл имеет эта ленивая инициализация. Насколько я знал, целочисленные значения всегда передаются значениями, но похоже, что это не так:

Код: Выделить всё

class Lazy:
def __init__(self, factory):
self._factory = factory
self._value = None

def _init(self):
if self._value is None:
self._value = self._factory()

def __getattr__(self, name):
self._init()
return getattr(self._value, name)

tmp = []
for el in [1, 2, 3]:
tmp.append(
Lazy(lambda : {"value":el})
)

print(tmp[0].get("value"))
Я ожидал увидеть на выходе `1`, но вместо этого получилось `3`... почему? потому что `el`, похоже, присваивается по ссылке.
Однако:

Код: Выделить всё

class Lazy:
def __init__(self, factory):
self._factory = factory
self._value = None

def _init(self):
if self._value is None:
self._value = self._factory()

def __getattr__(self, name):
self._init()
return getattr(self._value, name)

tmp = []
for el in [1, 2, 3]:
tmp.append(
Lazy(lambda el=el : {"value":el})
)

print(tmp[0].get("value"))
работает отлично, потому что now по какой-то причине передается по значению/копируется.
Теперь, если бы элемент `el` цикла for действительно был передан по ссылке, я бы ожидал такого кода:

Код: Выделить всё

tmp = [1, 2, 3]
for el in tmp:
el = 1
print(tmp)
для вывода `[1,1,1]`, но нет! он выводит `[1,2,3]`!

Подробнее здесь: https://stackoverflow.com/questions/798 ... in-lambdas

Вернуться в «Python»