В Python 2.*
вы можете отключить обычные оптимизации, выполняемые компилятором Python в отношении доступа к локальным переменным, запустив вашу функцию с exec ''
; это сделает функцию намного медленнее (я только что опубликовал ранее сегодня ответ, показывающий, как оптимизация локальной переменной может легко ускорить код в 3 или 4 раза), но это заставит ваш желаемый хак работать. Т.е. в Python 2. *:
def A():
exec ''
B(locals())
print x
def B(d):
d['x'] = 1
A()
будет излучать 1
, по вашему желанию.
Этот взлом был отключен в Python 3.*
(где exec
- это просто функция, а не оператор или ключевое слово) - теперь компилятор выполняет оптимизацию локальной переменной безоговорочно, так что больше нет никакого способа обойти это и заставить такие хаки работать.