Table of contents

None

NoneType is a built-in Python type defined in the types module, representing the type of the None object.

# Check the type of None print(type(None)) # <class 'NoneType'> # Attempt to access NoneType directly (not typically done) try: from types import NoneType # NoneType exists in types module print(NoneType) # <class 'NoneType'> except ImportError: print("NoneType import not needed for standard use")
  • None is the only value of NoneType, a singleton object in Python.
  • It represents the absence of a value or a null-like state.
# None in a dictionary d = {10: "Python", 20: None, 30: "Django"} print(d) # {10: 'Python', 20: None, 30: 'Django'} print(d[20], type(d[20])) # None <class 'NoneType'> # None as default return from dict.get() print(d.get(40), type(d.get(40))) # None <class 'NoneType'>
  • You cannot create new instances of NoneType (e.g., NoneType() raises NameError).
  • There is exactly one None object in memory, reused across the program.
# Attempt to create a NoneType instance try: n1 = NoneType() # Error: NoneType is not defined except NameError as e: print("Error:", e) # Error: name 'NoneType' is not defined # Verify None is a singleton a = None b = None print(a is b) # True (same object) print(id(a), id(b)) # Same memory address
  • None is distinct from False, 0, empty strings (""), empty lists ([]), or other falsy values.
  • Comparisons like None == False or None == "" return False.
  • None is distinct from False, 0, empty strings (""), empty lists ([]), or other falsy values.
  • Comparisons like None == False or None == "" return False.
# Comparisons with None print(None == False) # False print(None == 0) # False print(None == "") # False print(None == []) # False print(None is None) # True (use 'is' for None checks) # None in conditional (falsy but not False) value = None if not value: print("None is falsy") # Prints: None is falsy else: print("This won’t print")
  • None is a keyword and cannot be reassigned (e.g., None = 23.45 raises SyntaxError).
  • Similar restrictions apply to True and False.
# Attempt to assign to None try: None = 23.45 except SyntaxError as e: print("Error:", e) # Error: cannot assign to None # Attempt to assign to True/False try: True = 23 except SyntaxError as e: print("Error:", e) # Error: cannot assign to True try: False = 34 except SyntaxError as e: print("Error:", e) # Error: cannot assign to False
  • Setting an object’s reference to None makes it eligible for garbage collection, as it removes the reference to the object’s memory.
  • Example: Setting a dictionary or its keys to None can facilitate cleanup.
# Create a dictionary d = {10: "Python", 20: "Django", 30: "Data Sci"} print("Dictionary:", d, id(d)) # {10: 'Python', 20: 'Django', 30: 'Data Sci'} <id> # Set a key to None d[20] = None print("After d[20] = None:", d) # {10: 'Python', 20: None, 30: 'Data Sci'} # Use del to remove a key del d[20] print("After del d[20]:", d) # {10: 'Python', 30: 'Data Sci'} # Set dictionary to None d = None print("After d = None:", d, type(d)) # None <class 'NoneType'> # Alternative: Use del to remove dictionary d = {10: "Python", 20: "Django"} del d try: print(d) except NameError as e: print("Error:", e) # Error: name 'd' is not defined
  • Functions that do not explicitly return a value return None by default.
def no_return(): print("Hello") result = no_return() # Prints "Hello" print(result) # None

The get() method of dictionaries returns None when a key is not found (unless a default value is specified).

d1 = {10: 3.4, 20: 4.5, 30: 6.7, 40: 3.4} val = d1.get(200) print(val, type(val)) # None <class 'NoneType'>