2012-10-09 15 views

cevap

10

if __name__ == '__main__' bloğu ne olursa olsun özel bir şey yoktur. Yani, kapsamı gerçekleştiği yere göre belirlenir. Bu tür bloklar tipik olarak en üst düzeyde meydana geldiğinden, kapsamları globaldir.

Bu komut, tamamen yasal olan bir işlevde ortaya çıkarsa, kapsamı yerel olur; ancak, __name__, yine de modülde tanımlanan genel değere yine de çözüm getirir.

5
>>> if __name__ == '__main__': 
...  x = 1 
... print 'x' in globals() 
True 

düzenlemek: user4815162342 bu if-ifadesi herhangi kapsamı yazılmış edilebileceğini mükemmel bir noktaya değinmiş. Çoğu zaman küresel kapsamda yazılır.

>>> def foo(): 
...  if __name__ == '__main__': 
...   bar = 1 
... foo() 
... print 'bar' in globals() 
False 
+1

çalıştırıldığında çalıştırılır. Biraz kafa karıştırıcı, aynı zamanda 'locals() ': http://ideone.com/WbvTj. Muhtemelen, modülün üst seviyesinde, global kapsam yerel olanla aynıdır. – millimoose

3

Python blok-yerel kapsamı yoktur, buna bağlı olarak bir if bloğunun içinde kullanan tüm değişkenler en yakın çevreleyen "gerçek" kapsamında eklenecektir:

Burada bir işlev içinde. (Bir if..main blok için, genellikle modülün nitelikleri olacak.)

1

Bu sürece küresel kapsamda geçerli: değil içinden yani küresel kapsamda denir

  1. işlev
  2. yürütülmekte olan kod dosyasında.

    kod foo.py uğraşıyoruz varsayalım ve bar.py yılında, yönergeyi from foo import * var:

(2) göstermek için. Bu durumda, foo.py'daki if __name__ == "__main__": bloğu yürütülür. Bu blok yalnızca foo.py

+0

Aslında, '__name__ == '__main __'' bloğu iyi çalıştırılırsa, sadece '__name__' '__main__' değil,' foo 'olur. __name__'nin bu ayarı, değişken kapsam belirleme kurallarına tamamen ortogonaldir. – user4815162342

+0

@ user4815162342: Haklısınız. Ben sadece OP'in 'foo'yu' 'bar' içinde içe aktarmadığından emin olmak istedim ve '' foo''da' if '' değişkeninin 'bar'da görünmemesi nedenini merak ettim. küresel kapsam. – inspectorG4dget

İlgili konular