C++转Python必看:核心机制对比与地道OOP指南!
C转Python必看核心机制对比与地道OOP指南文章目录C转Python必看核心机制对比与地道OOP指南1. 基础数据结构与 STL 对比1.1 Struct 与 std::vector1.2 std::map、std::set 与 std::string2. 内存模型指针、引用与深浅拷贝2.1 本质模型区别盒子模型 vs 标签模型2.2 函数传参机制 (Pass-by-object-reference)2.3 可变 (Mutable) 与不可变 (Immutable) 对象3. 告别 for 循环列表推导式4. 面向对象 (OOP) 的核心差异4.1 this 指针 vs self 参数4.2 构造函数 __init__4.3 访问控制 public / private4.4 继承与重写 (Override)5. LeetCode 实战最小栈 (Min Stack)本笔记基于 C 开发者的视角通过代码实战对比快速掌握 Python 的核心机制与地道写法。1. 基础数据结构与 STL 对比1.1Struct与std::vectorC (struct/std::vector): 需要显式声明类型struct是公开的值类型。C 基准代码:#includevector#includestring#includealgorithmstructStudent{std::string name;intscore;};intmain(){std::vectorStudentstudents{{Alice,85},{Bob,92}};std::sort(students.begin(),students.end(),[](constStudenta,constStudentb){returna.scoreb.score;});}Python (dataclass/List):使用dataclass装饰器自动生成__init__(类似于构造函数)。使用内置的List([]) 替代vector支持混搭类型且自带动态扩容。Python 等价代码:fromdataclassesimportdataclassdataclassclassStudent:name:strscore:intstudents[Student(Alice,85),Student(Bob,92)]# 排序 (等价于 std::sort lambda)students.sort(keylambdas:s.score,reverseTrue)1.2std::map、std::set与std::stringC: 使用string,set,map操作繁琐。C 基准代码:#includestring#includeset#includemap#includesstreamstd::string textApple orange apple;std::setstd::stringunique_words;std::mapstd::string,intword_counts;std::istringstreamiss(text);std::string word;while(issword){unique_words.insert(word);word_counts[word];}Pythonstr: 字符串是不可变的自带丰富的内置方法如.lower(),.split()。Pythonset: 原生支持哈希集合使用{1, 2}初始化支持数学运算 (交集,|并集)。Pythondict(字典): 替代std::unordered_map极其高效使用{a: 1}初始化。Python 等价代码:textApple orange applewordstext.lower().split()# Set 去重unique_wordsset(words)# Dict 统计词频word_counts{}forwordinwords:word_counts[word]word_counts.get(word,0)12. 内存模型指针、引用与深浅拷贝这是 C 开发者最容易踩坑的地方Python 中没有 C 意义上的指针语法*和但一切变量的本质都是“智能指针对象引用”。2.1 本质模型区别盒子模型 vs 标签模型C (盒子模型 值语义): 当声明int a 10;时内存里挖了一个“盒子”a装入 10。a b默认发生深拷贝把b盒子里的东西复印一份装进a修改a不会影响b。Python (标签模型 引用语义):一切皆对象所有变量只是贴在对象上的“标签”。a b绝对不会发生复制它只是让两个标签拴在同一个内存对象气球上类似隐式的std::shared_ptr。Python 陷阱与拷贝:# 浅拷贝陷阱 (标签拴在同一个列表对象上)a[1,2,3]ba# ⚠️ b 和 a 指向同一个列表b.append(4)# a 也变成了 [1, 2, 3, 4]# 正确的拷贝方式ba.copy()# 浅拷贝 (只拷贝第一层)importcopy matrix_a[[1,2],[3,4]]matrix_ccopy.deepcopy(matrix_a)# 深拷贝 (完全独立等价于 C 的嵌套拷贝)2.2 函数传参机制 (Pass-by-object-reference)C: 有传值int、传指针int*、传引用int。Python:只有一种传参方式传对象引用。你可以理解为传入的参数是标签的一份复印件拴着同一个气球。defmodify(lst):# 场景 1通过标签修改气球内部 (会影响外部)lst.append(99)# 场景 2重绑定 (Rebinding) —— 把标签撕下来贴到新气球上# 这绝对不会影响外部的标签(相当于 C 修改了局部指针的指向: p new vector...)lst[4,5,6]my_list[1,2,3]modify(my_list)print(my_list)# 结果是 [1, 2, 3, 99]2.3 可变 (Mutable) 与不可变 (Immutable) 对象C 开发者常问“既然赋值都是贴标签为什么数字的赋值看起来像值拷贝”a10ba b20print(a)# 输出 10为什么 a 没变这是因为 Python 将对象分为两类不可变对象 (Immutable)数字 (int,float)、字符串 (str)、元组 (tuple)。它们是“钢铁打的气球”一旦造出就不能修改内部。当你写b 20时你不是在修改 10而是造了一个全新的气球 20然后把标签b移过去。标签a还在 10 上。可变对象 (Mutable)列表 (list)、字典 (dict)、字典 (dict)、集合 (set)、自定义类。它们是“橡胶打的气球”可以通过方法如.append()修改内部。修改内部时所有拴着它的标签都会看到变化。3. 告别 for 循环列表推导式Python 提倡声明式编程使用推导式 (Comprehension)替代 C 的std::transform和std::copy_if。C 基准代码:std::vectorintnums{1,2,3,4,5};std::vectorinteven_squares;for(intx:nums){if(x%20){even_squares.push_back(x*x);}}Python 等价代码:nums[1,2,3,4,5]# 映射 (Map) - std::transformsquares[x*xforxinnums]# 过滤 (Filter) - std::copy_ifevens[xforxinnumsifx%20]# 映射 过滤 (终极一行流)even_squares[x*xforxinnumsifx%20]4. 面向对象 (OOP) 的核心差异4.1this指针 vsself参数C (this): 编译器隐式传递的指针。Python (self): 显式传递。所有实例方法的第一个参数必须是self访问成员变量必须带上self.前缀否则会被当成局部变量。4.2 构造函数__init__Python 的构造函数永远叫__init__。它没有new关键字直接调用类名即可实例化。所有的实例变量必须在__init__中通过self.声明并初始化。4.3 访问控制public/privateC: 编译器强制的访问隔离。Python: “防君子不防小人”。没有真正的 private约定俗成单下划线开头如self._name表示受保护的内部变量外部不应直接访问。4.4 继承与重写 (Override)C: 严格控制需要virtual、public继承和初始化列表。C 基准代码:classDog{protected:std::string name;public:Dog(std::string n):name(n){}virtualvoidspeak(){std::coutname 汪汪叫\n;}};classFlyingDog:publicDog{public:FlyingDog(std::string n):Dog(n){}voidspeak()override{std::coutname 在天上叫\n;}};Python: 天生支持多态鸭子类型不需要virtual或override关键字。子类通过super().__init__()调用父类构造函数。Python 等价代码:classDog:def__init__(self,name):self._namename# 约定为私有defspeak(self):print(f{self._name}汪汪叫)classFlyingDog(Dog):def__init__(self,name):super().__init__(name)# 调用父类构造defspeak(self):# 直接覆盖不需要 virtualprint(f{self._name}在天上叫)5. LeetCode 实战最小栈 (Min Stack)对比 C 在private声明std::stackPython 直接在__init__中使用list([]) 模拟栈。C 基准代码:classMinStack{private:std::stackintdata_st;std::stackintmin_st;public:MinStack(){}voidpush(intval){data_st.push(val);if(min_st.empty()||valmin_st.top()){min_st.push(val);}}voidpop(){if(data_st.top()min_st.top())min_st.pop();data_st.pop();}inttop(){returndata_st.top();}intgetMin(){returnmin_st.top();}};Python 等价代码:classMinStack:def__init__(self):self.data_st[]# 主栈self.min_st[]# 最小值栈defpush(self,val:int)-None:self.data_st.append(val)ifnotself.min_storvalself.min_st[-1]:self.min_st.append(val)defpop(self)-None:ifself.data_st[-1]self.min_st[-1]:self.min_st.pop()self.data_st.pop()deftop(self)-int:returnself.data_st[-1]# [-1] 优雅获取栈顶defgetMin(self)-int:returnself.min_st[-1]

相关新闻

TPAMI 2025 | 数据稀缺场景救星!BSR5 从零训练仍超传统检测器,水下机器人视觉性能再突破

TPAMI 2025 | 数据稀缺场景救星!BSR5 从零训练仍超传统检测器,水下机器人视觉性能再突破

点击上方“小白学视觉”,选择加"星标"或“置顶” 重磅干货,第一时间送达你能想象吗?在浑浊的海水里,机器人要准确识别鱼群、珊瑚甚至沉船,难度堪比在雾霾天看清百米外的广告牌。水下目标检测一直是计算机视觉…

2026/7/3 7:40:09 阅读更多 →
电机PID调试进阶篇-野火上位机串口数据解析实战

电机PID调试进阶篇-野火上位机串口数据解析实战

1. 从“能用”到“会调”:为什么你需要深入理解串口数据流? 很多朋友在玩电机PID控制的时候,可能都有过这样的经历:跟着教程一步步把代码烧录进去,电机“嗡”的一声转起来了,PID调试助手的曲线也画出来了&a…

2026/5/17 11:13:02 阅读更多 →
Vue2+vant2整合企业微信JSSDK实战:从配置到发送小程序消息完整流程

Vue2+vant2整合企业微信JSSDK实战:从配置到发送小程序消息完整流程

Vue2与Vant2深度整合企业微信JSSDK:从权限配置到消息发送的实战避坑指南 最近在重构一个面向销售团队的内部工具时,我遇到了一个看似简单却颇为棘手的需求:在Vue2构建的管理后台中,让销售代表能一键将商品小程序页面分享给企业微信…

2026/5/17 11:13:02 阅读更多 →

最新新闻

终极B站视频下载指南:5分钟掌握大会员4K高清下载技巧

终极B站视频下载指南:5分钟掌握大会员4K高清下载技巧

终极B站视频下载指南:5分钟掌握大会员4K高清下载技巧 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 还在为B站视频无法离…

2026/7/3 9:00:32 阅读更多 →
3分钟掌握B站视频下载:解锁大会员4K画质永久保存技巧

3分钟掌握B站视频下载:解锁大会员4K画质永久保存技巧

3分钟掌握B站视频下载:解锁大会员4K画质永久保存技巧 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否曾经为B站视频…

2026/7/3 9:00:32 阅读更多 →
三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案

三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案

三步实现B站视频下载:解锁大会员4K和充电专属内容的完整解决方案 【免费下载链接】bilibili-downloader B站视频下载,支持下载大会员清晰度4K,持续更新中 项目地址: https://gitcode.com/gh_mirrors/bil/bilibili-downloader 你是否经…

2026/7/3 8:58:31 阅读更多 →
零代码AI开发平台Coze:从入门到实战

零代码AI开发平台Coze:从入门到实战

1. 认识Coze:零代码AI智能体开发平台作为一名长期关注AI应用落地的从业者,我见证了无数AI工具从诞生到成熟的过程。Coze(中文名"扣子")的出现确实让人眼前一亮——它完美解决了普通用户与AI技术之间的最后一公里问题。这…

2026/7/3 8:58:31 阅读更多 →
智能体设计模式与框架选型实战指南

智能体设计模式与框架选型实战指南

1. 智能体设计模式全景解析在当今人工智能领域,智能体(Agent)已成为连接大语言模型与实际应用的关键桥梁。作为一名长期深耕AI架构设计的开发者,我发现许多同行在构建智能体系统时常常陷入"工具选择困难症"——面对琳琅满目的框架和模式不知从…

2026/7/3 8:58:31 阅读更多 →
MinIO安全加固实战:修复crossdomain.xml跨域漏洞与Nginx反向代理方案

MinIO安全加固实战:修复crossdomain.xml跨域漏洞与Nginx反向代理方案

1. 项目概述:一次典型的MinIO安全合规实战最近在给公司内部的对象存储服务做安全加固,安全团队扫描报告里赫然列着一个“中危”漏洞:MinIO默认的crossdomain.xml文件配置不当,存在跨域资源共享(CORS)策略过…

2026/7/3 8:56:31 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻