Python基础:数据类型特性全面总结

Python中的数据类型可以分为可变和不可变两大类,同时也可以按是否为容器类型来分类。下面我将详细总结Python中主要数据类型的特性,包括可变性、容器性质、修改方式等。

一、基本数据类型分类

1. 不可变类型(Immutable)

  • 创建后不能被修改

  • 如果"修改",实际上是创建了新对象

  • 线程安全

2. 可变类型(Mutable)

  • 创建后可以被修改

  • 修改是在原对象上进行

  • 非线程安全

二、具体数据类型特性

1. 数字类型(不可变)

整型(int)
a = 10
b = a  # b和a指向同一个对象
a = 20  # 创建了新对象,b不受影响
浮点型(float)
x = 3.14
y = x
x = 2.71  # y仍然是3.14
布尔型(bool)
flag = True
flag = False  # 实际上是创建了新对象

特性

  • 不可变

  • 非容器

  • 值不可修改(只能重新赋值)

2. 字符串(不可变)

s = "hello"
s[0] = 'H'  # 报错:'str' object does not support item assignment
s = s + " world"  # 创建了新字符串

特性

  • 不可变

  • 是容器(可迭代,包含字符序列)

  • 内容不可修改

  • 支持切片操作(返回新字符串)

3. 列表(可变)

lst = [1, 2, 3]
lst[0] = 100  # 直接修改原列表
lst.append(4)  # 原地添加元素

特性

  • 可变

  • 是容器

  • 内容可修改

  • 支持增删改查操作

  • 可包含不同类型元素

4. 元组(不可变)

t = (1, 2, 3)
t[0] = 100  # 报错:'tuple' object does not support item assignment

特性

  • 不可变

  • 是容器

  • 内容不可修改

  • 比列表更节省内存

  • 可用作字典的键

5. 字典(可变)

d = {'name': 'Alice', 'age': 25}
d['age'] = 26  # 修改值
d['city'] = 'Beijing'  # 添加新键值对

特性

  • 可变

  • 是容器

  • 键必须是不可变类型(字符串、数字、元组等)

  • 值可以是任意类型

  • Python 3.7+ 保持插入顺序

6. 集合(可变)

s = {1, 2, 3}
s.add(4)  # 添加元素
s.remove(2)  # 删除元素

特性

  • 可变

  • 是容器

  • 元素必须是不可变类型

  • 无序且不重复

  • 支持集合运算(并集、交集等)

不可变集合(frozenset)
fs = frozenset([1, 2, 3])
fs.add(4)  # 报错:'frozenset' object has no attribute 'add'

特性

  • 不可变版本的集合

  • 可用作字典的键或其他集合的元素

三、数据类型对比表

数据类型可变性是否容器元素要求是否有序是否可哈希
int不可变--
float不可变--
bool不可变--
str不可变字符
list可变任意
tuple不可变任意
dict可变键不可变3.7+是
set可变不可变
frozenset不可变不可变

四、重要概念解释

1. 可哈希性(Hashable)

  • 可哈希对象才能作为字典的键或集合的元素

  • 不可变类型通常可哈希(list、dict、set除外)

  • 可变类型不可哈希

2. 深浅拷贝问题

  • 不可变类型:赋值、浅拷贝、深拷贝效果相同

  • 可变类型:

    • 赋值:只是创建新引用

    • 浅拷贝:只拷贝最外层容器

    • 深拷贝:递归拷贝所有层级

import copy

# 列表(可变类型)示例
lst1 = [1, [2, 3]]
lst2 = lst1  # 赋值
lst3 = lst1.copy()  # 浅拷贝
lst4 = copy.deepcopy(lst1)  # 深拷贝

3. 函数参数传递

  • 不可变类型作为参数:函数内修改不会影响原值

  • 可变类型作为参数:函数内修改会影响原值

def modify(num, lst):
    num += 1
    lst.append(100)

a = 10
b = [1, 2]
modify(a, b)
print(a)  # 输出10(不变)
print(b)  # 输出[1, 2, 100](已修改)

五、使用建议

  1. 不可变类型适用于:

    • 需要哈希的场景(字典键、集合元素)

    • 多线程环境

    • 需要确保不被意外修改的情况

  2. 可变类型适用于:

    • 需要频繁修改数据的场景

    • 构建复杂数据结构

    • 需要原地操作的场景

  3. 性能考虑

    • 元组比列表创建和访问更快

    • 集合比列表的成员检测更快

    • 字符串拼接推荐使用join()而非+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值