Tìm hiểu cách đối tượng None của Python biểu diễn sự vắng mặt của một giá trị. Khám phá thiết kế nội tại, các trường hợp sử dụng phổ biến, thực hành tốt nhất, và so sánh với null trong các ngôn ngữ khác.
Trong Python, None là cách tiêu chuẩn để biểu diễn sự vắng mặt của một giá trị. Nó xuất hiện khi dữ liệu bị thiếu, khi một biến chưa được khởi tạo, hoặc khi một hàm không có kết quả có ý nghĩa để trả về. Thay vì để mơ hồ, None cung cấp một tín hiệu rõ ràng rằng điều gì đó được cố ý để trống.
Các ngôn ngữ khác cũng tiếp cận tương tự với các cấu trúc như null trong Java và JavaScript hoặc nil trong Ruby. Tuy nhiên, Python định nghĩa None là một singleton của riêng kiểu NoneType, luôn được kiểm tra bằng phép kiểm tra đồng nhất (is None). Điều này giữ cho hành vi của nó nhất quán và dễ hiểu.
Về cốt lõi, None là thể hiện duy nhất của lớp NoneType. Python áp dụng mẫu thiết kế singleton ở đây: mọi tham chiếu đến None đều trỏ tới cùng một đối tượng. Điều này tiết kiệm bộ nhớ và đảm bảo các phép kiểm tra đồng nhất (is None) đáng tin cậy và nhanh.
Lớp NoneType được cố ý tối giản. Nó không thể được kế thừa, mở rộng hoặc thay đổi. Ở nội bộ, Python coi None là “bất tử”; nó không bao giờ bị gom rác. Ở mức C, nó được hiện thực là Py_None, với các macro hỗ trợ như Py_RETURN_NONE dùng cho hiệu năng trong các phần mở rộng CPython.
Mẫu sử dụng thực tiễn và khuyến nghị
Một cách dùng hàng ngày cho None là làm tham số mặc định trong hàm. Cách này tránh các rủi ro của đối số mặc định có thể thay đổi:
Mẫu này ngăn giá trị tồn tại ngoài ý muốn giữa các lần gọi. Bạn cũng sẽ gặp None trong tra cứu dictionary và phản hồi API. Chẳng hạn, my_dict.get("key") trả về None khi khóa không tồn tại. Tương tự, các hàm thường trả về None để báo hiệu không có kết quả:
deffind_user(user_id):return db.get(user_id,None)Được hỗ trợ bởi
Khi viết điều kiện, hãy ưu tiên 'if x is None' thay vì 'if not x' để bạn không vô tình coi 0, False, hoặc chuỗi rỗng là giá trị thiếu. Để tìm hiểu thêm về các kiến thức cơ bản của Python có liên quan tới None, hãy xem hướng dẫn Toán tử trong Python hoặc Hướng dẫn Python Classes của chúng tôi.
Lỗi thường gặp và cách khắc phục
Dù là một ý tưởng đơn giản, None thường gây ra các lỗi nhỏ. Chúng thường xuất hiện khi một biến mà bạn tin là có giá trị thực ra lại bằng không, dẫn đến hành vi bất ngờ hoặc lỗi khi chạy.
Cố gắng truy cập thuộc tính hoặc gọi phương thức trên giá trị None là một trong những lỗi phổ biến nhất. Tùy vào việc bạn đang cố làm gì, điều này sẽ ném ra AttributeError hoặc TypeError:
name =None
name.strip()# AttributeError: 'NoneType' object has no attribute 'strip'Được hỗ trợ bởi
Để tránh những bất ngờ như vậy, hãy lần theo nơi biến được gán lần cuối và kiểm tra các giá trị trả về bị thiếu. Các kiểm tra phòng thủ đơn giản mà hiệu quả:
Cũng cần phân biệt giữa None và các giá trị sai. None nghĩa là “chưa được đặt”, trong khi 0, “”, hoặc [] là các giá trị hợp lệ. Các hướng dẫn như Cách chạy script Python và Python New Line: Phương pháp định dạng mã có thể giúp mài giũa kỹ năng gỡ lỗi khi bạn thực hành.
Gợi ý kiểu và phát triển Python hiện đại
Với gợi ý kiểu, bạn có thể làm rõ vai trò của None trong chữ ký hàm. Chú thích Optional là một cách rõ ràng để làm điều này:
Các bộ kiểm tra kiểu tĩnh như mypy và Pyright có thể cảnh báo các vấn đề None tiềm ẩn trước khi chạy. Nếu bạn đang chuyển đổi từ môi trường khác, các khóa học như Intermediate Python for Developers hoặc Applied Statistics in Python cung cấp thực hành tốt với các tính năng hiện đại này.
Chủ đề nâng cao và các trường hợp biên
Vượt ra ngoài cách dùng hằng ngày, None còn đóng vai trò trong các kịch bản lập trình nâng cao. Hành vi của nó ảnh hưởng tới caching, metaprogramming, quản lý bộ nhớ và thậm chí cả đồng thời.
Trong các hệ thống bộ đệm hoặc memoization, None thường được dùng để đánh dấu rằng một phép tính chưa được chạy hoặc không có kết quả hợp lệ. Ví dụ, một mẫu khởi tạo lười biếng có thể dựa vào None để kích hoạt thiết lập hoãn:
Trong tuần tự hóa, None ánh xạ tới null trong JSON và tới NULL trong SQL. Các ORM như Django ORM hoặc SQLAlchemy xử lý các chuyển đổi này tự động, nhưng vẫn đáng để kiểm thử các trường hợp.
Tính đồng thời làm tăng độ phức tạp. Nếu nhiều luồng hoặc tác vụ async chia sẻ một biến được khởi tạo bằng None, bạn sẽ cần khóa hoặc cơ chế đồng bộ phù hợp để ngăn điều kiện tranh chấp. Các framework như Python NiceGUI nhấn mạnh rằng xử lý cẩn trọng các giá trị tùy chọn cũng quan trọng không kém trong ứng dụng front-end hoặc tương tác.
Cân nhắc hiệu năng và tối ưu hóa
Bây giờ chúng ta đã xem None hoạt động trong thực tế như thế nào, đáng để xem xét hồ sơ hiệu năng của nó. Vì None được nhúng sâu trong runtime của Python, cách nó được hiện thực có tác động trực tiếp tới tốc độ và sử dụng bộ nhớ.
Các phép kiểm tra đồng nhất với None là một trong những thao tác nhanh nhất bạn có thể thực hiện. Vì chỉ có một đối tượng None trong bộ nhớ, một câu lệnh như if x is None chỉ đơn giản là so sánh hai tham chiếu. Ngược lại, dùng so sánh bằng (== None) sẽ gọi các phương thức so sánh của đối tượng, chậm hơn và kém chính xác hơn.
Thiết kế singleton cũng góp phần vào hiệu quả bộ nhớ. Bất kể có bao nhiêu biến được đặt thành None, tất cả đều trỏ đến cùng một đối tượng. Trong các ứng dụng lớn truyền tải nhiều giá trị thiếu, như truy vấn cơ sở dữ liệu trả về trường trống hoặc API bỏ qua dữ liệu, thiết kế này ngăn trùng lặp không cần thiết trong bộ nhớ.
Dùng None làm đối số mặc định hoặc giá trị trả về không tạo thêm chi phí. Các hàm không chỉ định giá trị trả về sẽ tự động trả về None, và nó luôn tham chiếu tới cùng một singleton. Điều này làm cho lời gọi hàm có chi phí dự đoán được.
Ở cấp độ thông dịch, CPython bao gồm các lối tắt tận dụng trạng thái đặc biệt của None. Ví dụ, macro Py_RETURN_NONE đảm bảo cùng một đối tượng được trả về mỗi lần, tránh cấp phát mới. Những cải tiến gần đây của thông dịch viên cũng dựa trên tính bất biến này để tăng tốc kiểm tra và trả về.
Thực hành tốt nhất khi xử lý None
Sau khi đã khám phá hiệu năng, hãy chuyển sang các hướng dẫn thực tiễn khi làm việc với None trong mã hằng ngày. Xử lý None nhất quán sẽ giúp dự án đáng tin cậy và dễ bảo trì hơn.
Nguyên tắc đầu tiên là chỉ dùng None khi điều gì đó thực sự vắng mặt. Nó không nên dùng như một chỗ giữ chỗ chung chung. Nếu bạn cần đánh dấu một trạng thái đặc biệt khác với “không có giá trị”, hãy định nghĩa một đối tượng sentinel riêng. Điều này giúp ý định rõ ràng và tránh nhầm lẫn khi None đã có một ý nghĩa cụ thể.
Cũng nên làm cho giao diện của bạn rõ ràng. Khi một hàm có thể trả về None, hãy thể hiện điều đó trong chữ ký bằng gợi ý kiểu như str | None, và giải thích hành vi trong docstring. Điều tương tự áp dụng cho tham số: nếu None là đầu vào chấp nhận được, hãy nêu rõ. Sự rõ ràng này giúp cả công cụ phân tích tĩnh và các nhà phát triển khác đọc mã của bạn.
Xử lý lỗi cũng cần được chú trọng. Nếu None là một kết quả bình thường, hãy kiểm tra trực tiếp bằng is None và xử lý khéo léo. Nếu None báo hiệu điều gì đó đã sai, hãy ném ngoại lệ thay vì trả về lặng lẽ. Điều này giúp phát hiện và gỡ lỗi lỗi dễ dàng hơn.
Cuối cùng, hãy biến tài liệu thành một phần của quy trình. Ghi chú khi nào các hàm hoặc phương thức trả về None, vì sao điều đó xảy ra, và người gọi nên làm gì để phản hồi. Bằng cách xử lý None nhất quán và ghi chép việc sử dụng, bạn giảm thiểu mơ hồ và cải thiện chất lượng chung của codebase.
Tích hợp với hệ sinh thái Python hiện đại
Các framework như Django và Flask dựa nhiều vào None để biểu diễn giá trị thiếu hoặc tùy chọn. Trong Django, các trường mô hình với null=True chuyển trực tiếp giá trị SQL NULL thành Python None. Trong Flask, bộ phân tích JSON ánh xạ null trong yêu cầu đến None, vì vậy handler của route của bạn nên kiểm tra rõ ràng.
Cơ sở dữ liệu xử lý None bằng cách ánh xạ nó tới NULL. ORM đảm nhận việc này tự động, nhưng bạn luôn nên cân nhắc cẩn thận liệu một trường có thể null hay không.
API nên định nghĩa cách None được tuần tự hóa: bạn loại bỏ các trường tùy chọn hay bao gồm chúng với null? Sự nhất quán giúp mã phía client đơn giản hơn. Các công cụ như OpenAPI giúp ghi chép rõ ràng.
Các framework kiểm thử và thư viện xác thực dữ liệu (Pydantic, Marshmallow) cũng tích hợp chặt chẽ với None. Chúng cho phép bạn định nghĩa các trường tùy chọn, áp đặt quy tắc, và thất bại sớm khi đầu vào không khớp kỳ vọng.
None so với Null và các ngôn ngữ khác
None của Python giống với NULL trong SQL, Java và C, nhưng hành vi khác nhau. Trong SQL, NULL nghĩa là không rõ hoặc thiếu. Trong Java, null biểu diễn sự vắng mặt của một đối tượng, nhưng dereference nó sẽ gây lỗi. Trong C, NULL chỉ là một con trỏ 0.
JavaScript phân biệt giữa null (một giá trị trống có chủ đích) và undefined (chưa được gán). So sánh lỏng (null == undefined) cho kết quả true, có thể gây nhầm lẫn:
Trong một số trường hợp, các lựa chọn có cấu trúc thay cho None sẽ rõ ràng hơn. Phong cách lập trình hàm dùng các kiểu như Maybe, Result, hoặc Either để biểu diễn giá trị tùy chọn hoặc dễ lỗi. Python không bao gồm sẵn những thứ này, nhưng các thư viện có cung cấp nếu bạn muốn kiểm soát chặt chẽ hơn.
Một cách tiếp cận khác là dùng các đối tượng sentinel. Khác với None, chúng có thể biểu diễn các trạng thái như “chưa được đặt” mà không xung đột với đầu vào None hợp lệ.
Dù None tiện lợi ở nhiều nơi, hãy cẩn thận với các kiểm tra truthy/falsy. None, 0, False, và "" đều đánh giá là false, nhưng không thể thay thế cho nhau. Hãy dùng is None khi bạn muốn nói tới sự vắng mặt.
None đóng vai trò trung tâm trong thiết kế của Python. Từ hiệu quả bộ nhớ và an toàn kiểu cho tới tích hợp cơ sở dữ liệu và API, nó nhất quán biểu diễn sự vắng mặt của một giá trị theo cách có chủ đích.
Trong Python,
Nonelà cách tiêu chuẩn để biểu diễn sự vắng mặt của một giá trị. Nó xuất hiện khi dữ liệu bị thiếu, khi một biến chưa được khởi tạo, hoặc khi một hàm không có kết quả có ý nghĩa để trả về. Thay vì để mơ hồ,Nonecung cấp một tín hiệu rõ ràng rằng điều gì đó được cố ý để trống.Các ngôn ngữ khác cũng tiếp cận tương tự với các cấu trúc như
nulltrong Java và JavaScript hoặcniltrong Ruby. Tuy nhiên, Python định nghĩa None là một singleton của riêng kiểuNoneType, luôn được kiểm tra bằng phép kiểm tra đồng nhất (is None). Điều này giữ cho hành vi của nó nhất quán và dễ hiểu.Nếu bạn vẫn đang xây dựng nền tảng Python, các tài nguyên như Giới thiệu về Python và Python Cheat Sheet cho Người mới bắt đầu là điểm khởi đầu tốt. Nếu bạn là nhà phát triển đến từ hệ sinh thái khác, bạn cũng có thể hưởng lợi từ các hướng dẫn chuyển đổi như Python cho Người dùng MATLAB, Python cho Người dùng R, và Python cho Người dùng Bảng tính.
Kiến trúc kỹ thuật và chi tiết triển khai
Về cốt lõi,
Nonelà thể hiện duy nhất của lớpNoneType. Python áp dụng mẫu thiết kế singleton ở đây: mọi tham chiếu đếnNoneđều trỏ tới cùng một đối tượng. Điều này tiết kiệm bộ nhớ và đảm bảo các phép kiểm tra đồng nhất (is None) đáng tin cậy và nhanh.Lớp
NoneTypeđược cố ý tối giản. Nó không thể được kế thừa, mở rộng hoặc thay đổi. Ở nội bộ, Python coiNonelà “bất tử”; nó không bao giờ bị gom rác. Ở mức C, nó được hiện thực làPy_None, với các macro hỗ trợ nhưPy_RETURN_NONEdùng cho hiệu năng trong các phần mở rộng CPython.Mẫu sử dụng thực tiễn và khuyến nghị
Một cách dùng hàng ngày cho
Nonelà làm tham số mặc định trong hàm. Cách này tránh các rủi ro của đối số mặc định có thể thay đổi:Mẫu này ngăn giá trị tồn tại ngoài ý muốn giữa các lần gọi. Bạn cũng sẽ gặp
Nonetrong tra cứu dictionary và phản hồi API. Chẳng hạn,my_dict.get("key")trả vềNonekhi khóa không tồn tại. Tương tự, các hàm thường trả vềNoneđể báo hiệu không có kết quả:Khi viết điều kiện, hãy ưu tiên 'if x is None' thay vì 'if not x' để bạn không vô tình coi
0,False, hoặc chuỗi rỗng là giá trị thiếu. Để tìm hiểu thêm về các kiến thức cơ bản của Python có liên quan tớiNone, hãy xem hướng dẫn Toán tử trong Python hoặc Hướng dẫn Python Classes của chúng tôi.Lỗi thường gặp và cách khắc phục
Dù là một ý tưởng đơn giản,
Nonethường gây ra các lỗi nhỏ. Chúng thường xuất hiện khi một biến mà bạn tin là có giá trị thực ra lại bằng không, dẫn đến hành vi bất ngờ hoặc lỗi khi chạy.Cố gắng truy cập thuộc tính hoặc gọi phương thức trên giá trị
Nonelà một trong những lỗi phổ biến nhất. Tùy vào việc bạn đang cố làm gì, điều này sẽ ném raAttributeErrorhoặcTypeError:Để tránh những bất ngờ như vậy, hãy lần theo nơi biến được gán lần cuối và kiểm tra các giá trị trả về bị thiếu. Các kiểm tra phòng thủ đơn giản mà hiệu quả:
Cũng cần phân biệt giữa
Nonevà các giá trị sai.Nonenghĩa là “chưa được đặt”, trong khi0,“”, hoặc[]là các giá trị hợp lệ. Các hướng dẫn như Cách chạy script Python và Python New Line: Phương pháp định dạng mã có thể giúp mài giũa kỹ năng gỡ lỗi khi bạn thực hành.Gợi ý kiểu và phát triển Python hiện đại
Với gợi ý kiểu, bạn có thể làm rõ vai trò của
Nonetrong chữ ký hàm. Chú thíchOptionallà một cách rõ ràng để làm điều này:Các bộ kiểm tra kiểu tĩnh như
mypyvàPyrightcó thể cảnh báo các vấn đềNonetiềm ẩn trước khi chạy. Nếu bạn đang chuyển đổi từ môi trường khác, các khóa học như Intermediate Python for Developers hoặc Applied Statistics in Python cung cấp thực hành tốt với các tính năng hiện đại này.Chủ đề nâng cao và các trường hợp biên
Vượt ra ngoài cách dùng hằng ngày,
Nonecòn đóng vai trò trong các kịch bản lập trình nâng cao. Hành vi của nó ảnh hưởng tới caching, metaprogramming, quản lý bộ nhớ và thậm chí cả đồng thời.Trong các hệ thống bộ đệm hoặc memoization,
Nonethường được dùng để đánh dấu rằng một phép tính chưa được chạy hoặc không có kết quả hợp lệ. Ví dụ, một mẫu khởi tạo lười biếng có thể dựa vàoNoneđể kích hoạt thiết lập hoãn:Trong tuần tự hóa,
Noneánh xạ tớinulltrong JSON và tớiNULLtrong SQL. Các ORM như Django ORM hoặc SQLAlchemy xử lý các chuyển đổi này tự động, nhưng vẫn đáng để kiểm thử các trường hợp.Tính đồng thời làm tăng độ phức tạp. Nếu nhiều luồng hoặc tác vụ async chia sẻ một biến được khởi tạo bằng
None, bạn sẽ cần khóa hoặc cơ chế đồng bộ phù hợp để ngăn điều kiện tranh chấp. Các framework như Python NiceGUI nhấn mạnh rằng xử lý cẩn trọng các giá trị tùy chọn cũng quan trọng không kém trong ứng dụng front-end hoặc tương tác.Cân nhắc hiệu năng và tối ưu hóa
Bây giờ chúng ta đã xem
Nonehoạt động trong thực tế như thế nào, đáng để xem xét hồ sơ hiệu năng của nó. VìNoneđược nhúng sâu trong runtime của Python, cách nó được hiện thực có tác động trực tiếp tới tốc độ và sử dụng bộ nhớ.Các phép kiểm tra đồng nhất với
Nonelà một trong những thao tác nhanh nhất bạn có thể thực hiện. Vì chỉ có một đối tượngNonetrong bộ nhớ, một câu lệnh nhưif x is Nonechỉ đơn giản là so sánh hai tham chiếu. Ngược lại, dùng so sánh bằng (== None) sẽ gọi các phương thức so sánh của đối tượng, chậm hơn và kém chính xác hơn.Thiết kế singleton cũng góp phần vào hiệu quả bộ nhớ. Bất kể có bao nhiêu biến được đặt thành
None, tất cả đều trỏ đến cùng một đối tượng. Trong các ứng dụng lớn truyền tải nhiều giá trị thiếu, như truy vấn cơ sở dữ liệu trả về trường trống hoặc API bỏ qua dữ liệu, thiết kế này ngăn trùng lặp không cần thiết trong bộ nhớ.Dùng
Nonelàm đối số mặc định hoặc giá trị trả về không tạo thêm chi phí. Các hàm không chỉ định giá trị trả về sẽ tự động trả vềNone, và nó luôn tham chiếu tới cùng một singleton. Điều này làm cho lời gọi hàm có chi phí dự đoán được.Ở cấp độ thông dịch, CPython bao gồm các lối tắt tận dụng trạng thái đặc biệt của
None. Ví dụ, macroPy_RETURN_NONEđảm bảo cùng một đối tượng được trả về mỗi lần, tránh cấp phát mới. Những cải tiến gần đây của thông dịch viên cũng dựa trên tính bất biến này để tăng tốc kiểm tra và trả về.Thực hành tốt nhất khi xử lý None
Sau khi đã khám phá hiệu năng, hãy chuyển sang các hướng dẫn thực tiễn khi làm việc với
Nonetrong mã hằng ngày. Xử lýNonenhất quán sẽ giúp dự án đáng tin cậy và dễ bảo trì hơn.Nguyên tắc đầu tiên là chỉ dùng
Nonekhi điều gì đó thực sự vắng mặt. Nó không nên dùng như một chỗ giữ chỗ chung chung. Nếu bạn cần đánh dấu một trạng thái đặc biệt khác với “không có giá trị”, hãy định nghĩa một đối tượng sentinel riêng. Điều này giúp ý định rõ ràng và tránh nhầm lẫn khiNoneđã có một ý nghĩa cụ thể.Cũng nên làm cho giao diện của bạn rõ ràng. Khi một hàm có thể trả về
None, hãy thể hiện điều đó trong chữ ký bằng gợi ý kiểu nhưstr | None, và giải thích hành vi trong docstring. Điều tương tự áp dụng cho tham số: nếuNonelà đầu vào chấp nhận được, hãy nêu rõ. Sự rõ ràng này giúp cả công cụ phân tích tĩnh và các nhà phát triển khác đọc mã của bạn.Xử lý lỗi cũng cần được chú trọng. Nếu
Nonelà một kết quả bình thường, hãy kiểm tra trực tiếp bằngis Nonevà xử lý khéo léo. NếuNonebáo hiệu điều gì đó đã sai, hãy ném ngoại lệ thay vì trả về lặng lẽ. Điều này giúp phát hiện và gỡ lỗi lỗi dễ dàng hơn.Cuối cùng, hãy biến tài liệu thành một phần của quy trình. Ghi chú khi nào các hàm hoặc phương thức trả về None, vì sao điều đó xảy ra, và người gọi nên làm gì để phản hồi. Bằng cách xử lý None nhất quán và ghi chép việc sử dụng, bạn giảm thiểu mơ hồ và cải thiện chất lượng chung của codebase.
Tích hợp với hệ sinh thái Python hiện đại
Các framework như Django và Flask dựa nhiều vào
Noneđể biểu diễn giá trị thiếu hoặc tùy chọn. Trong Django, các trường mô hình vớinull=Truechuyển trực tiếp giá trị SQL NULL thành Python None. Trong Flask, bộ phân tích JSON ánh xạ null trong yêu cầu đến None, vì vậy handler của route của bạn nên kiểm tra rõ ràng.Cơ sở dữ liệu xử lý None bằng cách ánh xạ nó tới
NULL. ORM đảm nhận việc này tự động, nhưng bạn luôn nên cân nhắc cẩn thận liệu một trường có thể null hay không.API nên định nghĩa cách None được tuần tự hóa: bạn loại bỏ các trường tùy chọn hay bao gồm chúng với null? Sự nhất quán giúp mã phía client đơn giản hơn. Các công cụ như OpenAPI giúp ghi chép rõ ràng.
Các framework kiểm thử và thư viện xác thực dữ liệu (Pydantic, Marshmallow) cũng tích hợp chặt chẽ với None. Chúng cho phép bạn định nghĩa các trường tùy chọn, áp đặt quy tắc, và thất bại sớm khi đầu vào không khớp kỳ vọng.
None so với Null và các ngôn ngữ khác
Nonecủa Python giống vớiNULLtrong SQL, Java và C, nhưng hành vi khác nhau. Trong SQL,NULLnghĩa là không rõ hoặc thiếu. Trong Java,nullbiểu diễn sự vắng mặt của một đối tượng, nhưng dereference nó sẽ gây lỗi. Trong C,NULLchỉ là một con trỏ 0.JavaScript phân biệt giữa null (một giá trị trống có chủ đích) và undefined (chưa được gán). So sánh lỏng (null == undefined) cho kết quả true, có thể gây nhầm lẫn:
Python tránh sự mơ hồ này bằng cách bám vào một khái niệm duy nhất:
Để có cái nhìn rộng hơn về vị trí của Python phù hợp, hãy xem Anaconda và Python: Khác biệt chính hoặc Bạn có thể làm gì với Python?
Các lựa chọn thay thế và mẫu nâng cao
Trong một số trường hợp, các lựa chọn có cấu trúc thay cho
Nonesẽ rõ ràng hơn. Phong cách lập trình hàm dùng các kiểu nhưMaybe,Result, hoặcEitherđể biểu diễn giá trị tùy chọn hoặc dễ lỗi. Python không bao gồm sẵn những thứ này, nhưng các thư viện có cung cấp nếu bạn muốn kiểm soát chặt chẽ hơn.Một cách tiếp cận khác là dùng các đối tượng sentinel. Khác với
None, chúng có thể biểu diễn các trạng thái như “chưa được đặt” mà không xung đột với đầu vàoNonehợp lệ.Dù
Nonetiện lợi ở nhiều nơi, hãy cẩn thận với các kiểm tra truthy/falsy.None,0,False, và""đều đánh giá là false, nhưng không thể thay thế cho nhau. Hãy dùngis Nonekhi bạn muốn nói tới sự vắng mặt.Để xem thêm các mẫu như thế này, hãy xem Hướng dẫn hàm Python any() và Hướng dẫn Python lambda của chúng tôi, nơi khám phá cách các giá trị tùy chọn và mặc định xuất hiện trong mã thực tế.
Kết luận
Noneđóng vai trò trung tâm trong thiết kế của Python. Từ hiệu quả bộ nhớ và an toàn kiểu cho tới tích hợp cơ sở dữ liệu và API, nó nhất quán biểu diễn sự vắng mặt của một giá trị theo cách có chủ đích.Nếu bạn sẵn sàng tiếp tục xây dựng kỹ năng Python, các tài nguyên như Giới thiệu về Nhập dữ liệu trong Python, Nhập dữ liệu trong Python (Trung cấp), và Importing Data in Python Cheat Sheet là bước tiếp theo tự nhiên.