Дивные проектные решения принятые разработчиками сабжа по накурке не перестают удивлять.
Как, оказывается, связываются свободные переменные в питоновских лямбдах!? По ссылке? По значению? Мимо! ПО ИМЕНИ и SCOPE !!!! То есть вот это работает:
По неопытности можно себе как-нибудь все волосы изорвать.
Как, оказывается, связываются свободные переменные в питоновских лямбдах!? По ссылке? По значению? Мимо! ПО ИМЕНИ и SCOPE !!!! То есть вот это работает:
>>> i=3 >>> add=lambda x:i+x >>> add(3) 6 >>> i=[1,2] >>> add([3]) [1,2,3]
По неопытности можно себе как-нибудь все волосы изорвать.
no subject
Date: 2021-07-07 11:13 pm (UTC)Ну я б не спешил критиковать. Таков уж у них scope. Closure, чо.
no subject
Date: 2021-07-07 11:20 pm (UTC)no subject
Date: 2021-07-07 11:31 pm (UTC)no subject
Date: 2021-07-07 11:40 pm (UTC)no subject
Date: 2021-07-08 12:51 am (UTC)null3
no subject
Date: 2021-07-08 06:48 am (UTC)Переменные с лексическим Scope связываются в Lexical environment.
Глобальные, как в данном случае остаются таковыми, т.е. по имени.
no subject
Date: 2021-07-08 06:04 pm (UTC)no subject
Date: 2021-07-08 07:34 pm (UTC)в Лисп бы это было:
no subject
Date: 2021-07-08 08:25 pm (UTC)i = 3 # Ввели новую переменную `i`.
add = lambda x : i + x # Запомнили ссылку на `i`.
i = [1, 2] # Модифицировали опредѣленную выше `i`. Это не новая перемѣнная.
add([3]) # [1, 2] + [3] потому что `add` содержитъ ссылку на `i`.
no subject
Date: 2021-07-08 08:53 pm (UTC)D={} L=[1,2,3] D['foo']=L print(D) print(L) L=[4,5,6] print(D) print(L)то получу
{'foo':[1,2,3]} [1,2,3] {'foo':[1,2,3]} [4,5,6]Т.е. мы видим что L пошла своей дорогой, а то что мы отдали в D — своей.
Однако с лямбдами правила игры внезапно меняются. К чему у меня и претензии.
no subject
Date: 2021-07-09 05:43 am (UTC)$ python3
>>> i=1
>>> def f():
... return i
...
>>> f()
1
>>> i=2
>>> f()
2
no subject
Date: 2021-07-09 09:22 am (UTC)