2012-10-09 5 views

Trả lời

10

Không có gì đặc biệt về số if __name__ == '__main__' chặn bất kỳ thứ gì. Đó là để nói, phạm vi của nó được xác định bởi nơi nó xảy ra. Vì các khối như vậy thường xảy ra ở cấp cao nhất, phạm vi của chúng là toàn cầu.

Nếu khối này xảy ra trong một hàm, hoàn toàn hợp pháp, phạm vi của nó sẽ là cục bộ — ngoại trừ __name__ vẫn sẽ giải quyết với giá trị toàn cầu được xác định trong mô-đun.

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

chỉnh sửa: user4815162342 làm cho điểm tuyệt vời này nếu-tuyên bố có thể được viết trong bất kỳ phạm vi. Nó thường được viết trong phạm vi toàn cầu.

Dưới đây là bên trong một hàm:

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

Hơi gây nhầm lẫn, nó cũng nằm trong 'local()': http://ideone.com/WbvTj. Có lẽ, ở cấp cao nhất của mô-đun, phạm vi toàn cục giống với phạm vi cục bộ. – millimoose

3

Python không có phạm vi khối địa phương, vì vậy bất kỳ biến bạn sử dụng bên trong một khối if sẽ được thêm vào kèm theo phạm vi "thực" gần nhất. (Đối với một khối if..main, họ sẽ thường có các thuộc tính của mô-đun.)

1

Đó là trong phạm vi toàn cầu chừng nào:

  1. nó được gọi là trong phạm vi toàn cầu, tức là không phải từ trong vòng một chức năng
  2. nó nằm trong tệp mã đang được thực hiện.

Để minh họa (2):

Giả sử bạn đang trong foo.py, và trong bar.py, bạn phải báo cáo kết quả from foo import *. Trong trường hợp này, khối if __name__ == "__main__": trong foo.py không được thực hiện. Khối này chỉ được thực hiện khi foo.py chạy

+0

Trên thực tế, 'if __name__ == '__main __'' block được thực hiện tốt, nó chỉ là '__name__' xảy ra không phải là' __main__', nhưng 'foo'. Cài đặt này của '__name__' hoàn toàn trực giao với các quy tắc phạm vi biến. – user4815162342

+0

@ user4815162342: Bạn nói đúng. Tôi chỉ muốn đảm bảo rằng OP đã không nhập 'foo' bên trong' bar' và tự hỏi tại sao các biến trong 'if __name__ ==" __main __ "' trong 'foo' không hiển thị trong' bar' phạm vi toàn cầu. – inspectorG4dget