Ben zaten Python’un if False
’ı optimize ettiğini bildiğim için öyle denedim, if 8 < -2
ile aynı sonucu almamız x
değişkeninin nasıl load edileceğinin syntax’a göre belirlendiğini gösteriyor. Sıkıntı da burada aslında, dinamik olarak yüklenmesini bekliyorduk ama CPython yazdığımız koda göre hareket ediyor.
Burası daha çok optimizasyon ile alakalı. Dediğiniz gibi if False
’ı direkt silecek kadar zeki olan CPython if 8 < -2
’ye dokunmuyor. Aslında bu biraz çelişkili, const değerler arasındaki aritmetik işlemlerde optimizasyon var çünkü:
>>> from dis import dis
>>> dis("8 < -2")
1 0 LOAD_CONST 0 (8)
2 LOAD_CONST 1 (-2)
4 COMPARE_OP 0 (<)
6 RETURN_VALUE
>>> dis("8 + -2")
1 0 LOAD_CONST 0 (6)
2 RETURN_VALUE
Ama bunun aldığımız hatayla çok alakası yok, sadece x
’in nasıl yükleneceğinin bu optimizasyonlardan önceki durum dikkate alınarak kararlaştırıldığını söyleyebiliriz.
Bu arada sorunun çözümü basit:
def one():
x = 2
def two():
nonlocal x
if 8 < -2:
x = 7
x
two()