当前位置: 首页 > news >正文

【C#vsPython·第一阶段】变量声明这件事,C# 和 Python 差了十万八千里

在 C# 里声明一个变量就像是给银行开户——你得先告诉银行编译器这个账户是什么类型是储蓄账户int还是信用卡账户string在 Python 里声明变量就像是往兜里塞东西——你直接塞进去就行了至于是什么类型...解释器会自己看。当我第一次写x 5然后发现居然不需要声明类型的时候我的内心是这也行那我之前写的那些int x 5;算什么后来我才明白Python 的变量只是一个标签可以贴在任何对象上。而 C# 的变量是一个容器只能装特定类型的东西。今天咱们来聊聊变量声明和类型系统——C# 的类型安全 vs Python 的动态类型。变量声明基础对比C# 版本// 显式类型声明 int x 5; string name 张三; double price 9.99; bool isTrue true; // 类型推断var var y 10; // 编译器推断为 int var msg hello; // 编译器推断为 string // 动态类型 dynamic z 5; // 运行时才确定类型 z hello; // 可以改变类型Python 版本# Python 天生就是推断的 x 5 # int name 张三 # str price 9.99 # float is_true True # bool # 也可以加类型注解但解释器不理你 y: int 10 name: str 李四对比项C#Python变量声明int x 5;x 5类型声明必须或用 var可选类型注解类型推断var x 5;天生就是推断的动态类型dynamic x 5;所有变量都是动态的常量const int X 5;没有 const用全大写命名为什么 Python 不需要声明类型因为 Python 是动态类型语言变量的类型在运行时确定而不是编译时。变量只是一个标签可以贴在任何对象上。x 5 # x 贴在整数 5 上 x hello # x 现在贴在字符串 hello 上 x [1, 2] # x 现在贴在列表上这就像C# 的变量是专用抽屉只能放一种东西Python 的变量是便利贴可以贴在任何东西上。类型注解C# 程序员的安慰剂C# 的类型注解是强制的int x 5; string name hello; // var 是语法糖编译器还是知道类型 var y 10; // y 是 int // 接口和泛型 IEnumerableint numbers new Listint { 1, 2, 3 };Python 的类型注解是可选的解释器根本不理你x: int 5 name: str hello # 但 IDE 会用它来做智能提示 def greet(name: str) - str: return fHello, {name} # 泛型Python 3.12 from typing import TypeVar T TypeVar(T) def first(lst: list[T]) - T: return lst[0]特性C#Python类型注解目的编译检查IDE 提示 文档类型检查时机编译时运行时忽略注解类型安全强制自愿错误发现编译时运行时Python 的类型注解就像考试时老师说可以翻书但翻了也不一定有用。真实场景Python 的类型注解主要是给IDE和类型检查工具如 mypy用的。在大厂的 Python 项目里类型注解是强制的因为代码量太大没有类型检查会出人命。常量和只读变量C# 有真正的常量// 编译时常量 const double Pi 3.14159; const string Greeting Hello; // 运行时常量只读 readonly int MaxRetries 3;Python 没有 const只有约定# 用全大写命名约定 PI 3.14159 GREETING Hello # 这只是一个约定你还是可以修改它 PI 999 # 不会报错但会被鄙视 # 如果真想保护可以用 dataclass from dataclasses import dataclass dataclass(frozenTrue) class Config: pi: float 3.14159 greeting: str HelloPython 的常量全靠自觉改了也不会报错但会被同事鄙视。为什么 Python 不支持 const因为 Python 的设计哲学是**成年人应该被信任**。它假设你知道自己在做什么不需要语言层面的强制约束。变量作用域C# 的作用域很清晰——大括号内有效{ int x 5; // x 在这个块内有效 } // x 10; // 编译错误x 不存在Python 的作用域遵循 LEGB 规则Local → Enclosing → Global → Built-inx global # 全局变量 def outer(): x enclosing # 外层函数变量 def inner(): x local # 局部变量 print(x) # 输出: local inner() # 如果想修改全局变量 counter 0 def increment(): global counter counter 1Python 的作用域比 C# 复杂——它会一层层往外找变量找到哪个用哪个。为什么 Python 要用 LEGB 规则因为 Python 的函数可以嵌套定义闭包是常见模式。LEGB 规则让内层函数可以访问外层函数的变量这是实现闭包的基础。类型转换// C# 类型转换 int x 5; double y (double)x; // 显式转换 string s x.ToString(); // 转字符串 int z int.Parse(123); // 字符串转 int int w Convert.ToInt32(456); // Convert 方法# Python 类型转换 x 5 y float(x) # 转浮点数 s str(x) # 转字符串 z int(123) # 字符串转 int w bool(0) # 转布尔0 是 FalseC# 有多种转换方式强转、Parse、ConvertPython 就简单粗暴——int()、str()、float()一个函数搞定。真实案例C# 的int.Parse(abc)会抛异常而 Python 的int(abc)也会抛异常。但 C# 还有int.TryParse()可以安全转换Python 没有这个你得用try-except。设计哲学C# 的哲学是类型安全——编译器帮你检查类型错误显式声明让代码更清晰适合大型项目和团队协作。Python 的哲学是动态类型——类型是值的属性不是变量的属性鸭子类型让代码更灵活适合快速开发。C# 像是给每个变量办了身份证随时可以查验 Python 像是让变量自由流动需要的时候再看它是什么。更深层的原因C# 需要编译器提前知道类型才能生成高效的机器码Python 是解释执行的不需要提前知道类型运行时动态查找方法迁移指南C# 开发者最容易犯的错**以为没有类型就是不安全**Python 有类型注解只是可选忘记global关键字在函数里修改全局变量需要global以为变量声明后类型固定Python 变量可以随时换类型过度使用类型注解Python 不需要像 C# 那样到处写类型以为None是关键字Python 里None是一个对象不是关键字推荐工具用 VS Code Pylance 插件可以获得类似 ReSharper 的类型提示体验。坑点提醒类型注解不等于类型检查——写了注解解释器也不理你x: int hello # 不会报错 print(type(x)) # class str变量可以改变类型——C# 的dynamic也没这么自由x 5 print(type(x)) # class int x hello print(type(x)) # class str常量约定不是强制的——改了也不会报错MAX_SIZE 100 MAX_SIZE 999 # 不会报错但违反约定作用域陷阱——函数内赋值不会修改全局变量x 10 def modify(): x 20 # 这是新变量不是修改全局的 x print(x) # 20 modify() print(x) # 还是 10一句话总结Python 的类型注解就是给 C# 程序员的安慰剂——你可以写但解释器不一定理你。下一篇咱们来聊聊基本数据类型——C# 的int有大小限制Python 的int却能无限大。还有Python 的True True居然等于 2代码仓库GitHubhttps://github.com/LadyKiller1025/csharp-python-demosGiteehttps://gitee.com/qakjhzx/csharp-python-demos 欢迎点赞、收藏、转发你的支持是我持续创作的动力
http://www.rkmt.cn/news/1400485.html

相关文章:

  • 别再乱编译OpenSSL了!聊聊CentOS/RHEL 8里那些‘魔改’的系统库依赖
  • 从 Shadow AI 到企业级工作流治理:技术团队怎么落地
  • C++编程中的命名空间基本知识讲解
  • 2026 年6月国内怎么开通 ChatGPT Plus?苹果、安卓、虚拟卡、合租、代充一次说清
  • 终极指南:5分钟快速上手AzurLaneAutoScript,彻底解放你的碧蓝航线游戏时间
  • 三步解锁百度网盘高速下载:Python解析工具完全指南
  • 深入TB67H450数据手册:从VREF引脚到RS电阻,一步步算清你的步进电机驱动电流
  • 怎样通过POC测试快速检验AI Agent平台的实力?深度解析企业级AI智能体选型标准与落地实战
  • AI模型算法创新与计算资源需求解析
  • 2026杭州GEO优化公司深度横评:5家服务商避坑实测与选型指南 - 品牌报告
  • 保形预测实现智能体检索置信度校准:从理论到工程实践
  • 魔兽争霸3兼容性修复终极指南:5步解决现代系统运行问题
  • 2026靠谱的感应控制、动态、线光源楼宇外立面灯厂家推荐 - 工业品牌热点
  • 百炼多模态全家桶:图像、语音、视频一站式搞定
  • 如何快速解锁原神60帧限制:终极帧率优化指南
  • 深圳全屋定制避坑指南:如何甄选靠谱品牌? - 产品测评官
  • Windows驱动管理终极指南:用RAPR工具实现系统驱动的快速清理与优化
  • 生产环境部署:Fastify 静态服务 + SPA fallback
  • 构建股票分析AI智能体:三大设计模式解决数据幻觉与深度挖掘
  • 突破Windows权限限制:RunAsTI获取TrustedInstaller权限的终极指南
  • RV1126人脸识别项目实战:手把手教你搞定GC2053红外摄像头驱动配置(附完整DTS代码)
  • 火锅串串培训价格大揭秘,选哪家 - 工业品牌热点
  • GEE数据集:全球森林变化数据集Hansen Global Forest Change v1.13 (2000-2025)
  • 魔兽争霸3全面优化指南:5步彻底解决现代硬件兼容性问题
  • 凡亿AD最小系统板--导线及 Net Label 网络标号添加
  • 保姆级教程:用OpenIPC和WFB-NG在Jetson Orin Nano上搭建你的第一套FPV无人机AI视觉链路
  • API静默变更引发集成故障:防御性编码与监控策略实践
  • 从DOM定位器到计算机视觉:构建更健壮的端到端测试体系
  • 明事理妻子是丈夫最大的贵人的庖丁解牛
  • AzurLaneAutoScript:碧蓝航线智能自动化脚本,解放双手的终极游戏助手