在 Python 3 中,数据类型转换分为隐式转换(Python 自动完成)和显式转换(开发者使用内置函数强制转换)。由于 Python 是强类型语言,它不会像 JavaScript 那样随意进行隐式转换(例如不会把字符串 "1" 和数字 1 自动相加),因此掌握显式转换非常重要。
以下是 Python 3 数据类型转换的全面指南:
1. 数字与字符串的转换
这是最常见的转换场景。
# 1. 数字 -> 字符串 (str)
num = 100
print(str(num) + " apples") # 输出: "100 apples"
print(str(3.14)) # 输出: "3.14"
# 2. 字符串 -> 整数 (int)
print(int("42")) # 输出: 42
print(int("-10")) # 输出: -10
# 3. 字符串 -> 浮点数 (float)
print(float("3.14")) # 输出: 3.14
print(float("1e3")) # 输出: 1000.0 (支持科学计数法)
# ⚠️ 常见陷阱:不能直接将包含小数点的字符串转为 int
# int("3.14") # 会报错: ValueError: invalid literal for int() with base 10: '3.14'
# 正确做法:先转 float,再转 int
print(int(float("3.14"))) # 输出: 3 (注意:是向下截断,不是四舍五入)2. 数字类型之间的转换
# 1. 浮点数 -> 整数 (int)
# 注意:int() 转换浮点数时是直接“截断”小数部分,而不是四舍五入
print(int(3.9)) # 输出: 3
print(int(-3.9)) # 输出: -3
# 如果需要四舍五入,请使用 round()
print(round(3.9)) # 输出: 4
# 2. 整数 -> 浮点数 (float)
print(float(5)) # 输出: 5.0
# 3. 数字 -> 布尔值 (bool)
# 0 和 0.0 转换为 False,其他所有数字转换为 True
print(bool(0)) # False
print(bool(1)) # True
print(bool(-5)) # True3. 容器(序列)类型之间的转换
列表 (list)、元组 (tuple) 和集合 (set) 之间可以相互转换。字符串也可以被视为字符的序列进行转换。
# 1. 字符串 -> 列表/元组/集合
text = "hello"
print(list(text)) # ['h', 'e', 'l', 'l', 'o']
print(tuple(text)) # ('h', 'e', 'l', 'l', 'o')
print(set(text)) # {'h', 'e', 'l', 'o'} (自动去重且无序)
# 2. 列表 <-> 元组 <-> 集合
my_list = [1, 2, 2, 3]
my_tuple = tuple(my_list) # (1, 2, 2, 3)
my_set = set(my_list) # {1, 2, 3} (常用于列表快速去重)
back_to_list = list(my_set)# [1, 2, 3]
# 3. 转换为字典 (dict)
# 方法 A:包含双元素元组/列表的序列
pairs = [("a", 1), ("b", 2)]
print(dict(pairs)) # {'a': 1, 'b': 2}
# 方法 B:使用 zip 函数合并两个列表
keys = ["name", "age"]
values = ["Alice", 25]
print(dict(zip(keys, values))) # {'name': 'Alice', 'age': 25}
# 方法 C:关键字参数 (键必须是合法的标识符/字符串)
print(dict(name="Bob", age=30)) # {'name': 'Bob', 'age': 30}4. 布尔值转换 (Truth Value Testing) 🌟
在 Python 中,任何对象都可以被转换为布尔值。理解哪些值被视为 False 是写出 “Pythonic”(地道)代码的关键。
以下所有值转换为 bool 时均为 False:
- 常量:
None,False - 数字零:
0,0.0,0j(复数零) - 空序列/集合:
""(空字符串),[](空列表),()(空元组),{}(空字典),set()(空集合)
除此之外的所有值,转换为 bool 均为 True。
# 实际应用:在 if 语句中直接判断,而不是写 if len(my_list) > 0:
my_list = []
if not my_list: # 空列表被视为 False,not False 即为 True
print("列表为空")
name = ""
if name:
print("名字不为空")
else:
print("名字为空") # 会执行这一行5. 字符串与复杂数据结构的转换 (进阶)
有时我们需要将形如 "[1, 2, 3]" 或 "{'a': 1}" 的字符串转换回真实的列表或字典。
import json
import ast
json_str = '["apple", "banana"]'
dict_str = "{'name': 'Alice', 'age': 25}" # 注意:标准 JSON 要求双引号,这是 Python 字典格式的字符串
# ❌ 危险做法:使用 eval()
# eval(dict_str) # 虽然能工作,但如果字符串来自用户输入,会导致严重的安全漏洞 (代码注入)
# ✅ 推荐做法 1:使用 ast.literal_eval (安全地评估 Python 字面量)
safe_dict = ast.literal_eval(dict_str)
print(type(safe_dict)) # <class 'dict'>
print(safe_dict['name']) # 'Alice'
# ✅ 推荐做法 2:使用 json 模块 (适用于标准 JSON 格式字符串)
# 注意:JSON 字符串中的键和字符串值必须使用双引号 " "
valid_json_str = '{"name": "Alice", "age": 25}'
data = json.loads(valid_json_str)
print(type(data)) # <class 'dict'>6. 隐式类型转换 (自动转换)
在某些数学运算中,Python 会自动将“较低”的类型提升为“较高”的类型,以避免数据丢失。
优先级大致为:bool < int < float < complex
# int 和 float 运算,int 自动转为 float
result = 5 + 2.5
print(result) # 7.5
print(type(result))# <class 'float'>
# bool 参与数学运算时,True=1, False=0
print(True + 3) # 4💡 核心避坑总结
int("3.14")会报错:必须先用float("3.14")转换,再用int()截断。int()是截断不是四舍五入:int(3.99)结果是3。需要四舍五入请用round(3.99)。- 空字典的表示:
{}创建的是空字典,如果要创建空集合,必须使用set()。 list()转换字符串:list("abc")会变成['a', 'b', 'c']。如果你想把整个字符串作为列表的一个元素,应该写成["abc"]。
如果你对某种特定的转换场景(例如:时间字符串转 datetime 对象,或者字节 bytes 与字符串的转换)有疑问,可以随时告诉我!