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

避免 Python 类型转换错误:实用指南

在 Python 中,变量的类型是明确的,不能在没有显式转换的情况下直接将一种类型的值赋给另一种不同类型的变量。例如,以下将字符串与整数直接相加会报错,这跟其它语言有所差异,其它语言会进行隐式转

a = "5"
b = 2
# c = a + b 
# TypeError: can only concatenate str (not "int") to str

我们需要先将字符串 a 显示转换为 int,然后再进行相加,如下所示

a = "5"
b = 2
c = int(a) + b # 7

那么问题来了,Python 在什么场景下,会进行类型的隐式转换呢?作者进行了以下场景的总结汇总,在 Python 中,隐式转换(也称为自动类型转换)主要发生在以下几种特定情况下:

1、数值类型之间的转换

当进行算术运算时,Python 会自动将较小的数据类型转换为较大的数据类型。例如,int 会被转换为 float,以避免精度丢失。

a = 5      # int
b = 2.0    # float
c = a + b  # a 会被转换为 float# --------输出--------
# 7.0

即使是比较操作,但是只要双方都是数值类型,Python 会尝试将不同类型的值转换为相同类型进行比较

print(5 < 5.0)  # int 被转换为 float# --------输出--------
# False

当使用一些函数处理不同类型的元素时,只要双方都是数值类型,Python 会尝试进行隐式转换。

print(max(1, 2.5))  # int 被转换为 float
# --------输出--------
# 2.5
2、布尔值与数值的运算

在进行算术运算时,True 和 False 会被分别转换为 1 和 0

result = True + 2
result
# --------输出--------
# 3
3、在 format() 或 f-string 中的类型转换

当格式化字符串时,非字符串类型会被自动转换为字符串。

value = 10
formatted = f"The value is {value}"  # value 被转换为字符串
formatted# --------输出--------
# 'The value is 10'

综上所述,上面的场景可总结为两种 Python 会尝试进行隐式转换:

1)数值类型自身之间、以及和布尔值之间可以进行

(2)在 format() 或 f-string 中的类型转换

除以上两种总结的情形外,其它的类型放在一起运算时,都不会进行类型隐式转换,会导致以下两种异常情况产生:

1、程序执行报错
a = "5"
b = 2
# c = a + b 
# TypeError: can only concatenate str (not "int") to str
2、结果不符预期

如下所示,因为不会将字符串 “1”隐式转换为 1,所以以下程序执行输出 None,没有找到对应的额属性

d = {1: "one", 2: "two"}
print(d.get("1")) # 期望输出:one# --------输出--------
# None

所以大家平时编程中一定要注意类型匹配,养成良好的编程习惯,不然很容易得到非预期的程序结果,而花费很多的时间进行调试,耗时耗力,得不偿失!


如果你喜欢本文,欢迎点赞,并且关注我们的微信公众号:Python技术极客,我们会持续更新分享 Python 开发编程、数据分析、数据挖掘、AI 人工智能、网络爬虫等技术文章!让大家在Python 技术领域持续精进提升,成为更好的自己!


http://www.mrgr.cn/news/48791.html

相关文章:

  • 51单片机的智能温控风扇【proteus仿真+程序+报告+原理图+演示视频】
  • 配置WSGI 服务器(Gunicorn)和Nginx 反向代理服务器部署Flask项目
  • Hi电源芯片选型表
  • 手撕数据结构 —— 栈(C语言讲解)
  • java 程序在服务器出现时区错误问题(使用Date,LocalDateTime,ZonedDateTime都不正确)
  • 完成单位信息宣传考核任务投稿为什么邮箱投稿不香了?
  • 【ProtoBuf】基础使用与编译
  • C# udp通信测试助手-点对点-网络断开检测
  • 在SpringBoot+VUE中 实现登录-RSA的加密解密
  • Spring Boot 项目中 Redis 与数据库性能对比实战:从缓存配置到时间分析,详解最佳实践
  • 【Java知识】java进阶-手撕动态代理
  • 【AI论文精读12】RAG论文综述2(微软亚研院 2409)P4-隐性事实查询L2
  • 16路舵机控制芯片lu9685使用技巧
  • 数据结构-5.4.二叉树的性质
  • 认识C++的变量与整型
  • threejs-补间动画Tween应用
  • [Linux] Linux 进程程序替换
  • 【C++】关联式容器——map和set的使用
  • 可观察性的三大支柱:统一日志、指标和跟踪
  • 衡石分析平台系统管理手册-智能运维之系统日志