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»