查看: 143|回复: 1

Python基础数据类型详解:type/isinstance判断及可变不可变特性实践

[复制链接]
发表于 1 小时前 | 显示全部楼层 |阅读模式
在Python编程中,数据类型是变量存储数据的格式和规则。本文梳理Python内置的标准数据类型的核心特性、可变与不可变分类,以及如何用type()和isinstance()检查类型,帮助开发者快速搭建数据类型的知识框架。

一、查看数据类型的两种方法

1. type():精准返回对象类型
每定义一个变量,Python都会为其分配一个类型。使用内置函数type()可以查看任意变量或字面量的具体类型:
  1. num = 18
  2. print(type(num))  # 输出: <class 'int'>
复制代码

2. isinstance():判断对象是否属于指定类型
isinstance(待检测对象, 类型)返回布尔值True或False,适合在条件分支中做类型校验:
  1. num = 10
  2. print(isinstance(num, int))   # True
  3. print(isinstance(num, str))   # False
  4. s = "python"
  5. print(isinstance(s, str))     # True
复制代码
实际开发中,isinstance()比type()更灵活,因为它支持继承关系的判断(例如bool是int的子类)。

二、标准数据类型:可变与不可变分类

Python内置类型分为两大类:

1. 不可变类型(修改操作会生成新对象,原对象地址改变)
   - Number(数字):int、float、bool
   - String(字符串)
   - Tuple(元组)

验证不可变性的代码:
  1. # int整数
  2. a = 10
  3. print(id(a))
  4. a = a + 5   # 看似修改,实际创建新对象
  5. print(id(a)) # id不同
  6. # 字符串str
  7. s = "hello"
  8. print(id(s))
  9. s += "world"
  10. print(id(s)) # id改变
  11. # 元组tuple
  12. t = (1, 2, 3)
  13. print(id(t))
  14. t = t + (4,) # 注意逗号,构造新元组
  15. print(id(t)) # id改变
复制代码

2. 可变类型(值可原地修改,内存地址不变)
   - List(列表)
   - Dictionary(字典)
   - Set(集合)

验证可变性的代码:
  1. # 列表
  2. lst = [1, 2, 3]
  3. print(id(lst))
  4. lst.append(4)
  5. lst[0] = 99
  6. print(id(lst)) # id完全不变
  7. # 字典
  8. d = {"name": "小明"}
  9. print(id(d))
  10. d["age"] = 18
  11. print(id(d)) # id不变
  12. # 集合
  13. s = {1, 2, 3}
  14. print(id(s))
  15. s.add(4)
  16. print(id(s)) # id不变
复制代码

三、数字类型(Number)的三种子类型

3.1 int 整数
- 可表示正负整数和0。
- Python 3中的int没有长度限制,只要内存足够,数值可以无限大。
  1. a = 10
  2. b = -66
  3. c = 0
  4. d = 9999999999999999999999999999
  5. print(type(a)) # <class 'int'>
复制代码

3.2 float 浮点数
- 表示带小数点的数字,支持科学计数法(如5e3表示5000.0)。
- 采用双精度存储,存在精度损耗,不适合高精度金额计算(应使用decimal模块)。
  1. f1 = 3.14
  2. f2 = -0.618
  3. f3 = 5e3  # 5000.0
  4. print(type(f1)) # <class 'float'>
复制代码

3.3 bool 布尔类型
- 只有两个值:True和False。
- 本质是int的子类,True=1,False=0,可以直接参与数学运算。
- 注意首字母大写,否则Python会当作普通变量。
  1. flag1 = True
  2. flag2 = False
  3. print(True + 5)   # 6
  4. print(isinstance(True, int))  # True
  5. print(type(flag1)) # <class 'bool'>
复制代码

四、字符串(string)
- 用单引号、双引号或三引号包裹的文本。
- 不可变,不能通过索引修改字符(s[0]='x'会报错)。
- 支持拼接、切片、获取长度等操作。
- 原始字符串(r前缀)可取消转义,例如路径字符串:
  1. s1 = 'hello'
  2. s2 = "I'm Python"
  3. s3 = """第一行
  4. 第二行"""
  5. s4 = r'C:\Users\name'  # 反斜杠不会被转义
  6. print(type(s1)) # <class 'str'>
复制代码

五、列表(List)
- 有序、可变的元素序列,用方括号[]定义。
- 可存放任意类型元素,支持增删改查。
  1. lst = [10, "张三", 3.14]
  2. lst[0] = 99  # 允许修改
  3. print(type(lst)) # <class 'list'>
复制代码

六、元组(Tuple)
- 有序、不可变的元素序列,用圆括号()定义。
- 可视为只读列表,安全性更高。
  1. t = (1, 2, "abc")
  2. # t[0] = 5  # 报错:'tuple' object does not support item assignment
  3. print(type(t)) # <class 'tuple'>
复制代码

七、字典(Dictionary)
- 键值对映射类型,用大括号{key:value}定义。
- 键必须为不可变类型(如int、str、tuple),且唯一不重复;值可以是任意数据类型。
- 查询效率高,适合存储结构化数据。
  1. dic = {"name": "李四", "age": 22, "score": [90, 88]}
  2. print(dic["name"])   # 通过键取值
  3. print(type(dic))      # <class 'dict'>
复制代码

八、集合(Set)
- 无序、不重复的元素容器,用大括号{元素}定义。
- 自动去重,常用于去重、交集并集等数学运算。
- 底层基于哈希表实现。
  1. s = {1, 2, 2, 3, 3, 3}
  2. print(s)        # {1, 2, 3} 自动去重
  3. print(type(s))  # <class 'set'>
复制代码

总结:
- 用type()查看对象具体类型,用isinstance()进行类型判断。
- Python基础类型分为数字、字符串、元组(不可变)和列表、字典、集合(可变)。
- 选择类型时,可变性是一个关键依据:需要频繁修改时用列表或字典,数据固定时用元组,唯一性要求用集合。
- 数字类型中的整型无上限,布尔型可直接参与算术运算,浮点数注意精度问题。

掌握这些基础数据类型的特性和用法,能帮助你编写更健壮、更高效的Python代码。
回复

使用道具 举报

发表于 1 小时前 | 显示全部楼层

Re: Python基础数据类型详解:type/isinstance判断及可变不可变特性实践

楼主这篇整理得很清晰,刚好把type()和isinstance()的区别以及可变/不可变的核心逻辑都串起来了。我自己平时写代码的时候,判断类型基本都用isinstance,尤其在处理继承关系时确实比type()省心。另外提一个小细节:验证不可变性时用id变化来证明是对的,但实际开发里也可以借助copy模块或者注意小整数池(比如-5到256之间的int在CPython中可能复用),不过不影响大原则。感谢分享,对新手很有帮助。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-14 16:50 , Processed in 0.029922 second(s), 18 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部