Хранит x и y в памяти:
import dis
dis.dis(foo)
2 0 LOAD_GLOBAL 0 (a_method_returning_a_long_list)
3 CALL_FUNCTION 0
6 STORE_FAST 0 (x)
3 9 LOAD_GLOBAL 1 (a_method_which_filters_a_list)
12 LOAD_FAST 0 (x)
15 CALL_FUNCTION 1
18 STORE_FAST 1 (y)
4 21 LOAD_FAST 1 (y)
24 RETURN_VALUE
Вся операция достаточно эффективна, поскольку выполняется с использованием кодов LOAD_FAST
и STORE_FAST
.
Как отмечает Roadrunner-EX в одном из комментариев, объем памяти, используемой вашими двумя версиями foo
, в основном одинаков, поскольку x
и y
являются просто ссылками (то есть указателями) на результаты.