Python 教程 --- Python 3.14.6 文档

# 完整代码
print("helloworld")
# 这是一个数据类型的测试
"""
以下有:
数字类型,字符串类型
列表类型,元组类型
set集合,dir字典类型
"""
def showInfo():
"""
这是一个显示函数:
:return: 没有返回值,void
"""
print(type(1))
print(type(3.14))
print(type(True))
print(type(False))
print(type("helloworld"))
list_l = [1,2,3]
print(type(list_l))
tuple_t = (1,2,3)
tuple_t1 = 1,2,3
print(type(tuple_t))
print(type(tuple_t1))
set_s = {1,2,3}
print(type(set_s))
dir_t = {1:"gaowanxi",2:"lisi"}
print(type(dir_t))
for i in dir_t:
print(dir_t[i])
源码:



Python 底层源码 object.h 完整解析(PyObject / PyVarObject)
这份是 Python3 底层 C 源码核心头文件 object.h,Python 里所有数据(int/str/list/tuple 等)底层全是 C 结构体封装对象,完美解释 "Python 一切皆对象"。
一、基础对象:PyObject(所有对象的基类)
c
typedef struct _object {
_PyObject_HEAD_EXTRA
Py_ssize_t ob_refcnt; // 引用计数
PyTypeObject *ob_type; // 对象类型指针
} PyObject;
字段详解
ob_refcnt引用计数 Python 垃圾回收核心标记:记录当前对象被多少地方引用。- 引用 + 1:
a = b;引用归 0 时自动释放内存。
- 引用 + 1:
ob_type类型指针 指向类型对象(比如int/str/list类型),对应 Pythontype()获取的类型。 这就是为什么type(1)能得到<class 'int'>。_PyObject_HEAD_EXTRA调试 / 追踪内存用的扩展字段,发布版基本为空。
作用
所有 Python 对象都继承 PyObject 结构,不管数字、字符串、列表,头部一定包含这两个字段。
二、变长对象:PyVarObject(可变长度容器对象)
c
typedef struct {
PyObject ob_base; // 继承基础PyObject
Py_ssize_t ob_size; // 可变元素长度
} PyVarObject;
字段详解
ob_base:内嵌完整PyObject,天然拥有引用计数、类型信息。ob_size:记录对象包含元素个数(长度)。- 适用类型:
str字符串、list列表、tuple元组、bytes等长度可变 / 多元素对象。 - 对应 Python 函数
len(),底层直接读取ob_size字段。
- 适用类型:
两类对象区分
- 定长 PyObject(无 ob_size) 单个数值、无内部元素:
int、bool、float。 - 变长 PyVarObject(带 ob_size) 多元素容器:字符串、列表、元组、集合、字节串。
三、类型转换宏定义
c
// 普通对象强制转PyObject*
#define _PyObject_CAST(op) ((PyObject*)(op))
// 常量版本
#define _PyObject_CAST_CONST(op) ((const PyObject*)(op))
// 变长对象强制转PyVarObject*
#define _PyVarObject_CAST(op) ((PyVarObject*)(op))
#define _PyVarObject_CAST_CONST(op) ((const PyVarObject*)(op))
C 源码中通用强转工具,任意 Python 对象指针都能转回基础结构体,方便读取引用计数、长度、类型。
四、配套注释:x is y 对象判断
底部注释:
c
// Test if the 'x' object is the 'y' object, the same as "x is y" in Python.
Python is 运算符底层逻辑:直接对比两个对象的内存地址 ,地址完全相等才返回 True; 而 == 是调用对象内部__eq__方法对比数据内容。
五、图中红色文字:变量无类型,数据有类型
对应 Python 核心特性:
- 变量本身没有类型 :
a = 1; a = "abc",变量a只是内存标签,可以绑定任意对象; - 内存里的数据(对象)自带类型 : 数字底层是
PyObject结构体,字符串底层是PyVarObject结构体,结构体里ob_type永久标记自身类型。
六、一句话总结设计逻辑
PyObject:所有对象通用头部,统一管理引用计数、类型;PyVarObject:在基对象基础上扩展长度字段,专门给字符串 / 列表等多元素容器使用;- Python 上层所有数据类型,都是基于这两个 C 结构体封装实现,这就是 "一切皆对象" 的底层根源。