【无标题】

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 结构体封装实现,这就是 "一切皆对象" 的底层根源。
相关推荐
爱莉希雅&&&18 小时前
Prometheus高可用(alertmanager+node_exporter+grafana)
运维·服务器·grafana·prometheus
sa1002718 小时前
搭建京东评论监控系统,自动捕捉新增评价,快速挖掘用户真实痛点
python
weixin_4617694019 小时前
anaconda安装pytorch安装python
人工智能·pytorch·python
YYYing.19 小时前
【C++大型项目之高性能服务器框架 (九) 】协议抽象与Http服务器模块
服务器·c++·http·高性能·c/c++·后端框架
ly-2725319 小时前
Ubuntu重启之后挂载盘符变更应该怎么修复
linux·ubuntu
梅雅达编程笔记19 小时前
编程启蒙|Scratch 转 Python 系列第10天:问答闯关游戏实战(AI题库管理+随机出题实战)
人工智能·python·游戏·青少年编程
Huangjin007_19 小时前
【Linux 系统篇(四)】权限详解(一)
linux·运维·服务器
AOwhisky19 小时前
Python 学习笔记(第十一期)——运维自动化(上·后篇):进程级监控与子进程管理——psutil进阶
运维·开发语言·python·学习·云原生·运维开发
人工干智能19 小时前
Python 的链式调用:一连串的“点”调用
开发语言·python