2014-04-20 14 views
5

Vì vậy, trong Python 2 nó đã được rõ ràng. Nhưng trong Python 3 tôi hơi bối rối một chút.Là True, False, Không có từ khóa hoặc được xây dựng trong Python 3?

>>> import builtins 
>>> dir(builtins) 
['ArithmeticError', 'AssertionError', 'AttributeError', 'BaseException', 'BlockingIOError', 'BrokenPipeError', 'BufferError', 'BytesWarning', 'ChildProcessError', 'ConnectionAbortedError', 'ConnectionError', 'ConnectionRefusedError', 'ConnectionResetError', 'DeprecationWarning', 'EOFError', 'Ellipsis', 'EnvironmentError', 'Exception', 'False', 'FileExistsError', 'FileNotFoundError', 'FloatingPointError', 'FutureWarning', 'GeneratorExit', 'IOError', 'ImportError', 'ImportWarning', 'IndentationError', 'IndexError', 'InterruptedError', 'IsADirectoryError', 'KeyError', 'KeyboardInterrupt', 'LookupError', 'MemoryError', 'NameError', 'None', 'NotADirectoryError', 'NotImplemented', 'NotImplementedError', 'OSError', 'OverflowError', 'PendingDeprecationWarning', 'PermissionError', 'ProcessLookupError', 'ReferenceError', 'ResourceWarning', 'RuntimeError', 'RuntimeWarning', 'StopIteration', 'SyntaxError', 'SyntaxWarning', 'SystemError', 'SystemExit', 'TabError', 'TimeoutError', 'True', 'TypeError', 'UnboundLocalError', 'UnicodeDecodeError', 'UnicodeEncodeError', 'UnicodeError', 'UnicodeTranslateError', 'UnicodeWarning', 'UserWarning', 'ValueError', 'Warning', 'ZeroDivisionError', '__build_class__', '__debug__', '__doc__', '__import__', '__loader__', '__name__', '__package__', '__spec__', 'abs', 'all', 'any', 'ascii', 'bin', 'bool', 'bytearray', 'bytes', 'callable', 'chr', 'classmethod', 'compile', 'complex', 'copyright', 'credits', 'delattr', 'dict', 'dir', 'divmod', 'enumerate', 'eval', 'exec', 'exit', 'filter', 'float', 'format', 'frozenset', 'getattr', 'globals', 'hasattr', 'hash', 'help', 'hex', 'id', 'input', 'int', 'isinstance', 'issubclass', 'iter', 'len', 'license', 'list', 'locals', 'map', 'max', 'memoryview', 'min', 'next', 'object', 'oct', 'open', 'ord', 'pow', 'print', 'property', 'quit', 'range', 'repr', 'reversed', 'round', 'set', 'setattr', 'slice', 'sorted', 'staticmethod', 'str', 'sum', 'super', 'tuple', 'type', 'vars', 'zip'] 
>>> import keyword 
>>> dir(keyword.kwlist) 
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield'] 

Đúng, FalseKhông có mặt trong cả hai mô-đun builtinstừ khóa module. Vậy tôi nên đối xử với họ như thế nào? Là một lớp nội trang hoặc như một từ khóa?

Trả lời

6

Chúng là các từ dành riêng giá trị được tạo sẵn. Từ Python 3 What's New:

True, FalseNone được dành lời. (2.6 đã thực hiện một phần các hạn chế đối với None rồi.)

Điều này có nghĩa là bạn không thể sử dụng chúng làm tên, gán giá trị khác cho chúng. Điều này ngăn cản vô tình che được xây dựng trong các giá trị singleton:

>>> True = False 
    File "<stdin>", line 1 
SyntaxError: can't assign to keyword 

Xem thêm Guido van Rossum's history lesson on None, True and False:

tôi vẫn quên trả lời cho dù None/True/False là literals hoặc từ khóa. Câu trả lời của tôi là cả hai đều là. Đó là những từ khóa vì đó là cách trình phân tích cú pháp nhận ra chúng. Họ là những người theo nghĩa đen bởi vì đó là vai trò của họ trong các biểu thức và bởi vì họ đứng cho các giá trị không đổi.

Với True, FalseNone phân loại là từ khóa, trình biên dịch Python thực sự có thể tối ưu hóa việc sử dụng chúng, vì bạn có thể không (trực tiếp) rebind các tên Python có thể nhìn chúng như hằng số thay vì là toàn thể, đó là nhanh hơn.

Cho đến Python 3.4 vẫn còn một số trường hợp góc nơi trình biên dịch sẽ phát hành tra cứu toàn cầu cho các đối tượng này, xem issue 16619. Từ Python 3.4 trở đi, trình phân tích cú pháp Python đã được mở rộng để tạo ra một nút AST mới NameConstant để đảm bảo rằng chúng được coi là hằng số ở khắp mọi nơi.

+0

Nhưng nếu 'None',' True' và 'False' hiện là từ khóa Python, tại sao giữ chúng trong mô-đun * nội trang *? – ostrokach

+2

@ostrokach: tên * có thể là từ khóa, nhưng chúng vẫn cần tham chiếu đến các đối tượng thực. Khi bạn sử dụng tên, bạn vẫn muốn tên đó để giải quyết đối tượng. Và tại sao lại phá vỡ bất kỳ mã nào đã sử dụng 'builtins.False' hoặc' builtins.True' để bỏ qua một shadowing cục bộ? –

Các vấn đề liên quan