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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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