1. PEP 8 -- Style Guide for Python Code: In the "Naming Conventions" section, under "Descriptive: Naming Styles", it specifies: singleleadingunderscore: weak "internal use" indicator. E.g. from M import does not import objects whose names start with an underscore. (Source: https://peps.python.org/pep-0008/#naming-conventions)
2. The Official Python 3 Tutorial: Section 9.6, "Private Variables," explains that names prefixed with an underscore are treated by convention as non-public parts of an API. It states, "Since there is a valid use-case for class-private members... there is a convention that is honored by most Python code: a name prefixed with an underscore (e.g. spam) should be treated as a non-public part of the API." (Source: https://docs.python.org/3/tutorial/classes.html#private-variables)
3. MIT OpenCourseWare, Introduction to Computer Science and Programming in Python (Fall 2016): Lecture 8 notes on Object-Oriented Programming discuss encapsulation and mention that by convention, attributes starting with an underscore are intended to be private and not accessed directly from outside the class. (Source: MIT OCW, 6.0001, Lecture 8 Notes, Section on "Classes and Object-Oriented Programming").