Phạm vi của if __name__ == __main__
là gì? Tất cả mọi thứ được bao gồm trong tuyên bố này trong không gian toàn cầu?Phạm vi nếu __name__ == __main__
Trả lời
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.
>>> 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
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.)
Đó là trong phạm vi toàn cầu chừng nào:
- 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
- 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
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
@ 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
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