【无标题】

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.hPython 里所有数据(int/str/list/tuple 等)底层全是 C 结构体封装对象,完美解释 "Python 一切皆对象"。

一、基础对象:PyObject(所有对象的基类)

c

复制代码
typedef struct _object {
    _PyObject_HEAD_EXTRA
    Py_ssize_t ob_refcnt;    // 引用计数
    PyTypeObject *ob_type;   // 对象类型指针
} PyObject;

字段详解

  1. ob_refcnt 引用计数 Python 垃圾回收核心标记:记录当前对象被多少地方引用。
    • 引用 + 1:a = b;引用归 0 时自动释放内存。
  2. ob_type 类型指针 指向类型对象(比如int/str/list类型),对应 Python type() 获取的类型。 这就是为什么type(1)能得到<class 'int'>
  3. _PyObject_HEAD_EXTRA 调试 / 追踪内存用的扩展字段,发布版基本为空。

作用

所有 Python 对象都继承 PyObject 结构,不管数字、字符串、列表,头部一定包含这两个字段。

二、变长对象:PyVarObject(可变长度容器对象)

c

复制代码
typedef struct {
    PyObject ob_base;        // 继承基础PyObject
    Py_ssize_t ob_size;      // 可变元素长度
} PyVarObject;

字段详解

  1. ob_base:内嵌完整PyObject,天然拥有引用计数、类型信息。
  2. ob_size:记录对象包含元素个数(长度)。
    • 适用类型:str字符串、list列表、tuple元组、bytes长度可变 / 多元素对象
    • 对应 Python 函数 len(),底层直接读取ob_size字段。

两类对象区分

  1. 定长 PyObject(无 ob_size) 单个数值、无内部元素:intboolfloat
  2. 变长 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 核心特性:

  1. 变量本身没有类型a = 1; a = "abc",变量a只是内存标签,可以绑定任意对象;
  2. 内存里的数据(对象)自带类型 : 数字底层是PyObject结构体,字符串底层是PyVarObject结构体,结构体里ob_type永久标记自身类型。

六、一句话总结设计逻辑

  1. PyObject所有对象通用头部,统一管理引用计数、类型;
  2. PyVarObject:在基对象基础上扩展长度字段,专门给字符串 / 列表等多元素容器使用;
  3. Python 上层所有数据类型,都是基于这两个 C 结构体封装实现,这就是 "一切皆对象" 的底层根源。
相关推荐
金融小师妹21 小时前
多因子智能推演:油价回落6%与黄金震荡上行的关联解析——AI预测框架
大数据·python·深度学习
ltl1 天前
eBPF 可观测性全景:bcc、bpftrace、libbpf 的工程路径
linux
2401_868534781 天前
数仓开发落地手册
linux·运维
BUG研究员_1 天前
Runnable与LCEL
开发语言·人工智能·python
老马聊技术1 天前
Pytorch深度学习环境配置与测试
人工智能·pytorch·python
正在走向自律1 天前
使用atop工具监控Linux系统指标
linux·运维·php·实时监控·atop分析内存
Python私教1 天前
AI Agent 上生产要不要开写权限?我把执行链拆成 4 道闸门
人工智能·后端·python
天才测试猿1 天前
软件测试知识总结(基础篇)
自动化测试·软件测试·python·功能测试·测试工具·职场和发展·测试用例
崔子末1 天前
某影视库剧集列表以及查询接口逆向
爬虫·python