Python中变量和数据类型的使用方法和避坑指南
前言
上周面试,面试官问了一个问题:
a = [1, 2, 3] b = a b.append(4) print(a) # 输出什么?
我当时就愣了——a 居然也被改了,输出 [1, 2, 3, 4]!
后来才知道,Python 的变量不是"盒子装数据",而是"标签贴数据"。a 和 b 贴的是同一个列表,改一个另一个也变。这个坑不搞清楚,后面写代码全是 bug。
今天把变量和数据类型彻底讲明白,5个坑我都帮你踩过了。
一、变量:不是盒子,是标签
1.1 变量到底是什么?
很多教程说"变量是装数据的盒子",这个比喻在 Python 里不准确。
Python 的变量更像是一张便利贴——贴在数据上,而不是装着数据:
name = "张三" # 把"张三"这个便利贴贴在字符串上 age = 25 # 把"age"这个便利贴贴在整数25上 height = 1.75 # 贴在浮点数1.75上 is_student = True # 贴在布尔值True上
关键区别:
# "盒子"思维:a和b是两个独立的盒子 a = [1, 2, 3] b = a # 把a的内容复制一份给b? b.append(4) print(a) # [1, 2, 3, 4] ← a也被改了! # "标签"思维:a和b贴在同一个列表上 a = [1, 2, 3] b = a # b也贴到了同一个[1,2,3]上 b.append(4) # 改的是列表本身,a和b都能看到 print(a) # [1, 2, 3, 4] ← 合理!
坑1:变量是引用不是拷贝,赋值 b = a 不会创建新数据,只是多贴了一个标签。想真正拷贝用 b = a.copy() 或 b = a[:]。
1.2 变量命名规则
| 规则 | 正确示例 | 错误示例 | 原因 |
|---|---|---|---|
| 由字母、数字、下划线组成 | user_name | user-name | - 不是合法字符 |
| 不能以数字开头 | name2 | 2name | 数字开头非法 |
| 不能使用保留关键字 | class_ | class | class 是关键字 |
| 区分大小写 | Name ≠ name | — | Python 大小写敏感 |
Python 官方 PEP8 规范推荐 snake_case(蛇形命名法) :
# ✅ 推荐 user_name = "张三" max_value = 100 is_valid = True # ❌ 不推荐(驼峰命名在Python中不常见,通常只用于类名) userName = "张三" MaxValue = 100
1.3 动态类型:同一个变量能装不同类型
x = 10 # int print(type(x)) # <class 'int'> x = "hello" # 变成 str 了 print(type(x)) # <class 'str'> x = [1, 2, 3] # 又变成 list print(type(x)) # <class 'list'>
这在 Java/C++ 里不可能——变量声明了 int 就永远是 int。Python 随时能换,灵活但也容易出 bug。
建议:虽然 Python 允许变量类型变化,但尽量保持变量用途一致,别一个变量一会儿是数字一会儿是字符串,自己都看不懂。
二、5个基本数据类型
2.1 整数 int
整数就是没有小数点的数字,Python 中没有长度限制(取决于内存):
a = 100 # 十进制 b = 0b1100100 # 二进制(前缀 0b) c = 0o144 # 八进制(前缀 0o) d = 0x64 # 十六进制(前缀 0x) print(a, b, c, d) # 全部输出:100 # 大数字可以用下划线分隔,便于阅读 big_num = 1_000_000_000 print(big_num) # 1000000000 # 进制转换 print(bin(255)) # 0b11111111 print(oct(255)) # 0o377 print(hex(255)) # 0xff
2.2 浮点数 float
带小数点的数字,用于需要精度的场景。
坑2:0.1 + 0.2 ≠ 0.3,这是所有编程语言的通病,不只是 Python:
a = 0.1 + 0.2
print(a) # 0.30000000000000004 ← 不是0.3!
# 涉及钱的计算,一定要用 decimal
from decimal import Decimal
result = Decimal('0.1') + Decimal('0.2')
print(result) # 0.3 ✅
血泪教训:做金融类项目时,我因为用了 float 算金额,对账差了0.01元,排查了一整天。涉及钱,一律用 Decimal。
2.3 布尔值 bool
只有 True 和 False(首字母大写,别写 true)。
坑3:哪些值是 False?很多人答不全
# 这些都是 False("假"值/空值)
bool(0) # False
bool(0.0) # False
bool("") # False(空字符串)
bool([]) # False(空列表)
bool({}) # False(空字典)
bool(None) # False
# 其余都是 True
bool(1) # True
bool("abc") # True
bool([0]) # True(列表不为空,哪怕里面是0)
bool(-1) # True(负数也是True)
面试常考: "Python中哪些值是假值?" 记住口诀——零、空、None 就是假。
2.4 字符串 str
用单引号或双引号包裹的文本:
name = "张三"
address = '北京市朝阳区'
# 三引号:多行字符串
poem = """
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。
"""
# 原始字符串(转义字符不生效,Windows路径必备)
path = r"C:\new folder\file.txt"
# 不加r的话,\n会被当成换行符!
# 字符串拼接
print("Hello" + " " + "World") # Hello World
print("Ha" * 3) # HaHaHa
2.5 None
None 表示"什么都没有",不是0,不是空字符串,不是False。
result = None print(result is None) # True # 区分 None 和空值 empty_list = [] print(empty_list is None) # False!空列表不是None print(len(empty_list) == 0) # True,这才是判断空列表的正确方式
坑4:判断空值用 is None,不要用 == None,虽然结果一样但 is 才是 Python 规范。判断空列表/空字符串用 len(x) == 0 或直接 if not x:。
三、类型查看与转换
3.1 type() 和 isinstance()
x = 42 print(type(x)) # <class 'int'> # isinstance 判断类型(推荐,考虑继承关系) print(isinstance(x, int)) # True print(isinstance(x, (int, float))) # True(int或float都行)
type() vs isinstance() 的区别:
class Animal:
pass
class Dog(Animal):
pass
d = Dog()
print(type(d) == Animal) # False(type不认继承)
print(isinstance(d, Animal)) # True(isinstance认继承)
实际开发中 优先用 isinstance() ,更安全。
3.2 类型转换
# 转整数
int(3.14) # 3(截断,不四舍五入)
int("42") # 42
# 转浮点数
float(3) # 3.0
float("3.14") # 3.14
# 转字符串
str(42) # "42"
str(3.14) # "3.14"
# 转布尔值
bool(0) # False
bool("") # False
bool("abc") # True
坑5:字符串转数字会报错
int("abc") # ValueError! 程序直接崩了
# 安全转换方法
def safe_int(s, default=0):
try:
return int(s)
except ValueError:
return default
print(safe_int("100")) # 100
print(safe_int("abc")) # 0(不会崩)
实际开发中,凡是接收用户输入转数字的,都要做异常处理。
四、== 和 is 的区别(面试必考)
这个问题面试被问到的概率极高:
a = [1, 2, 3] b = [1, 2, 3] print(a == b) # True,值相等 print(a is b) # False,不是同一个对象(内存地址不同) c = a print(a is c) # True,是同一个对象
一句话记住:== 比较值,is 比较身份(是不是同一个对象)。
还有个小整数池的坑:
x = 256 y = 256 print(x is y) # True(-5到256会被缓存,同一对象) x = 257 y = 257 print(x is y) # False(超出缓存范围,不同对象)
面试官最爱问这个,记住 -5到256是小整数池的范围就行。
五、实战:登录验证系统
把上面学的布尔值、字符串、类型转换串起来:
"""用户登录验证 - 演示变量与数据类型的综合使用"""
def validate_login(username, password):
"""验证登录信息"""
valid_users = {
"admin": "123456",
"user1": "password",
"test": "test123"
}
if not username: # 空字符串是假值
return False, "用户名不能为空"
if username not in valid_users:
return False, "用户不存在"
if valid_users[username] != password:
return False, "密码错误"
return True, "登录成功"
# 测试
test_cases = [
("admin", "123456"), # 正确
("admin", "wrong"), # 密码错误
("unknown", "123"), # 用户不存在
("", "123"), # 空用户名
]
for username, password in test_cases:
success, message = validate_login(username, password)
status = "✅" if success else "❌"
print(f"{status} {username or '(空)'}: {message}")
运行结果:
✅ admin: 登录成功
❌ admin: 密码错误
❌ unknown: 用户不存在
❌ (空): 用户名不能为空
注意 not username 这里用了布尔值的特性——空字符串是假值,直接 if not username 就能判断空,不用写 if username == ""。这就是理解数据类型带来的简洁。
总结:5个坑一句话回顾
| 坑 | 一句话 | 避坑方法 |
|---|---|---|
| 坑1:变量是引用 | b = a 不会拷贝数据 | 用 .copy() 或 [:] |
| 坑2:浮点数精度 | 0.1+0.2≠0.3 | 涉及钱用 Decimal |
| 坑3:哪些是假值 | 零、空、None 就是假 | 记住口诀就行 |
| 坑4:判断空值 | == None 不规范 | 用 is None 或 if not x: |
| 坑5:字符串转数字 | int("abc") 直接崩 | try/except 包一下 |
到此这篇关于Python中变量和数据类型的使用方法和避坑指南的文章就介绍到这了,更多相关Python变量和数据类型内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!


最新评论