变量、数据类型与运算符核心观点在 Python 中“一切皆对象”变量不是存储数据的盒子而是指向对象的标签。理解这一点是掌握 Python 的第一步。一、变量名字与对象的绑定1.1 变量的本质在许多编程语言如 C/C中变量被看作是一个存储数据的盒子——你声明一个变量就是在内存中开辟一块空间存放数据。但在 Python 中变量是一个名字name是对内存中对象的引用reference。# 创建一个整数对象 100并让变量 a 指向它a100# 让变量 b 也指向同一个对象ba# 验证a 和 b 指向同一个对象print(id(a))# 例如140735892234096print(id(b))# 相同的地址print(aisb)# True底层原理变量 a ──→ 对象 100 (内存地址: 0x7fff...) ↑ 变量 b ───────┘id()函数返回对象的内存地址is运算符判断两个变量是否指向同一个对象。1.2 变量命名规范# ✅ 有效的变量名nameAlice_nameprivatename2Bobmy_namesnake_case# Python 推荐风格_my_private_var10# ❌ 无效的变量名2nameinvalid# 不能以数字开头my-nameinvalid# 不能包含连字符my nameinvalid# 不能包含空格classinvalid# 不能使用关键字命名规范PEP 8类型规范示例普通变量小写 下划线user_name,total_count常量全大写 下划线MAX_SIZE,PI类名大驼峰UserInfo,HttpRequest私有变量单下划线前缀_internal_var强私有双下划线前缀__private_var关键字列表不能使用作为变量名importkeywordprint(keyword.kwlist)# [False, None, True, and, as, assert, async, await,# break, class, continue, def, del, elif, else, except,# finally, for, from, global, if, import, in, is,# lambda, nonlocal, not, or, pass, raise, return,# try, while, with, yield]二、数据类型Python 的八大基本类型Python 是动态类型语言你不需要显式声明变量类型解释器会在运行时自动推断。x10# 整数xhello# 现在 x 是字符串x3.14# 现在 x 是浮点数2.1 数字类型Number整数int# Python 3 的整数可以表示任意大的数不受位数限制a10b-100c0# 大整数big123456789012345678901234567890print(big*big)# 轻松计算不会溢出# 不同进制binary0b1010# 二进制 10octal0o17# 八进制 15hexadecimal0xFF# 十六进制 255浮点数floatf13.14f2-0.5f32.5e10# 科学计数法 25000000000.0# 注意浮点数精度问题print(0.10.2)# 0.30000000000000004不是精确的 0.3# 解决方案使用 decimal 模块fromdecimalimportDecimalprint(Decimal(0.1)Decimal(0.2))# 0.3复数complexc34jprint(c.real)# 3.0print(c.imag)# 4.0print(abs(c))# 5.0 (模长)布尔值boolflagTrue# 或 False# 底层原理bool 是 int 的子类print(isinstance(True,int))# Trueprint(TrueTrue)# 2print(True*10)# 102.2 字符串str# 创建字符串s1单引号s2双引号s3多行 字符串s4也支持 双引号# 字符串是不可变对象shello# s[0] H # TypeError: str object does not support item assignment# 常用操作s Python Programming print(s.strip())# 去除首尾空格print(s.lower())# 转小写print(s.upper())# 转大写print(s.replace(Python,Java))print(len(s))# 字符串长度2.3 列表list# 列表是可变、有序的集合fruits[apple,banana,cherry]# 增删改查fruits.append(orange)# 添加元素fruits.insert(1,mango)# 在索引 1 处插入fruits.remove(banana)# 删除第一个匹配项poppedfruits.pop()# 删除并返回最后一个fruits[0]grape# 修改元素# 切片nums[0,1,2,3,4,5]print(nums[1:4])# [1, 2, 3]print(nums[::2])# [0, 2, 4] (步长为2)print(nums[::-1])# [5, 4, 3, 2, 1, 0] (反转)2.4 元组tuple# 元组是不可变、有序的集合coordinates(10,20)# 单元素元组需要逗号single(42,)# 不是 (42)# 元组解包x,ycoordinatesprint(x,y)# 10 20# 元组不可变coordinates[0]100# TypeError2.5 字典dict# 字典是键值对的集合键必须是不可变类型person{name:Alice,age:25,city:Beijing}# 访问和修改print(person[name])# Aliceperson[age]26# 修改person[email]aliceexample.com# 添加# 安全访问print(person.get(phone,N/A))# 键不存在返回默认值# 遍历forkey,valueinperson.items():print(f{key}:{value})2.6 集合set# 集合是无序、不重复的元素集s{1,2,3,3,3}# 自动去重print(s)# {1, 2, 3}# 集合运算a{1,2,3,4}b{3,4,5,6}print(a|b)# 并集: {1, 2, 3, 4, 5, 6}print(ab)# 交集: {3, 4}print(a-b)# 差集: {1, 2}print(a^b)# 对称差集: {1, 2, 5, 6}2.7 空值NoneresultNone# 表示没有值或空# 常用于函数默认返回值、初始化变量ifresultisNone:print(还没有结果)2.8 类型总结表类型英文可变性有序性示例整数int不可变-42浮点数float不可变-3.14字符串str不可变有序hello列表list可变有序[1, 2, 3]元组tuple不可变有序(1, 2, 3)字典dict可变无序3.7 有序{a: 1}集合set可变无序{1, 2, 3}布尔bool不可变-True三、类型检查与转换3.1 查看类型x10print(type(x))# class int# 类型检查print(isinstance(x,int))# Trueprint(isinstance(x,(int,float)))# True多个类型3.2 类型转换# 转整数int(42)# 42int(3.14)# 3截断小数int(1010,2)# 10二进制转十进制# 转浮点数float(3.14)# 3.14float(42)# 42.0# 转字符串str(42)# 42str([1,2,3])# [1, 2, 3]# 转列表/元组/集合list(abc)# [a, b, c]tuple([1,2,3])# (1, 2, 3)set([1,2,2,3])# {1, 2, 3}四、运算符Python 的计算工具箱4.1 算术运算符a,b17,5print(ab)# 22 (加法)print(a-b)# 12 (减法)print(a*b)# 85 (乘法)print(a/b)# 3.4 (除法结果为浮点数)print(a//b)# 3 (整除向下取整)print(a%b)# 2 (取余)print(a**b)# 1419857 (幂运算)# 整除的特殊情况负数print(-17//5)# -4向负无穷取整4.2 比较运算符x,y10,20print(xy)# False (等于)print(x!y)# True (不等于)print(xy)# False (大于)print(xy)# True (小于)print(xy)# False (大于等于)print(xy)# True (小于等于)# 链式比较Python 特色print(0x100)# True等价于 (0 x) and (x 100)4.3 赋值运算符x10x5# x x 5 → 15x-3# x x - 3 → 12x*2# x x * 2 → 24x/4# x x / 4 → 6.0x//2# x x // 2 → 3.0x**2# x x ** 2 → 9.0# 海象运算符 (Python 3.8)if(n:len(hello))3:print(f长度是{n})# 长度是 54.4 逻辑运算符a,bTrue,Falseprint(aandb)# False (与)print(aorb)# True (或)print(nota)# False (非)# 短路求值x0andprint(不会执行)# 0因为 0 为假直接返回y1orprint(不会执行)# 1因为 1 为真直接返回4.5 位运算符a,b5,3# 二进制: 101, 011print(ab)# 1 (按位与: 001)print(a|b)# 7 (按位或: 111)print(a^b)# 6 (按位异或: 110)print(~a)# -6 (按位取反)print(a1)# 10 (左移1位: 1010)print(a1)# 2 (右移1位: 10)4.6 成员运算符与身份运算符# 成员运算符fruits[apple,banana]print(appleinfruits)# Trueprint(grapenotinfruits)# True# 身份运算符a[1,2,3]ba c[1,2,3]print(aisb)# True同一对象print(aisc)# False不同对象值相同print(ac)# True值相等# None 比较用 isxNoneprint(xisNone)# Trueprint(xisnotNone)# False五、底层原理深度解析5.1 小整数池Small Integer Cachea100b100print(aisb)# Truex1000y1000print(xisy)# False某些交互环境可能为 True原理Python 预先缓存了-5 到 256之间的小整数对象。当你创建这个范围内的整数时Python 直接返回缓存的对象而不是新建。这是为了优化性能因为这些数字使用频率最高。5.2 字符串驻留String Interningahellobhelloprint(aisb)# Truexhello world!yhello world!print(xisy)# 可能 False取决于实现原理Python 会自动驻留intern某些字符串使相同内容的字符串共享同一个对象。这主要适用于看起来像标识符的字符串如变量名。强制驻留importsys asys.intern(hello world!)bsys.intern(hello world!)print(aisb)# True5.3 可变对象 vs 不可变对象# 不可变对象修改会创建新对象x10print(id(x))# 地址Ax1print(id(x))# 地址B不同# 可变对象修改保持同一对象lst[1,2,3]print(id(lst))# 地址Alst.append(4)print(id(lst))# 地址A相同为什么需要不可变对象安全性作为字典键时哈希值不会改变性能可以缓存和共享如小整数池、字符串驻留线程安全不可变对象天然线程安全六、实战项目6.1 BMI 计算器defcalculate_bmi(weight,height):计算 BMI 指数并返回健康建议bmiweight/(height**2)ifbmi18.5:category偏瘦advice建议适当增加营养摄入elifbmi24:category正常advice保持良好的生活习惯elifbmi28:category偏胖advice建议适当运动控制饮食else:category肥胖advice建议咨询医生制定减重计划returnbmi,category,advice# 使用weightfloat(input(请输入体重kg))heightfloat(input(请输入身高m))bmi,category,advicecalculate_bmi(weight,height)print(f\n您的 BMI 指数{bmi:.2f})print(f健康状态{category})print(f建议{advice})6.2 温度单位转换器deftemperature_converter():温度转换器支持摄氏度、华氏度、开尔文print(温度单位转换器)print(1. 摄氏度 → 华氏度)print(2. 华氏度 → 摄氏度)print(3. 摄氏度 → 开尔文)print(4. 开尔文 → 摄氏度)choiceinput(请选择转换类型1-4)tempfloat(input(请输入温度值))ifchoice1:resulttemp*9/532print(f{temp}°C {result:.2f}°F)elifchoice2:result(temp-32)*5/9print(f{temp}°F {result:.2f}°C)elifchoice3:resulttemp273.15print(f{temp}°C {result:.2f}K)elifchoice4:resulttemp-273.15print(f{temp}K {result:.2f}°C)else:print(无效选择)temperature_converter()七、常见陷阱与最佳实践7.1 浮点数比较# ❌ 错误print(0.10.20.3)# False# ✅ 正确importmathprint(math.isclose(0.10.2,0.3))# True# 或设置容差print(abs(0.10.2-0.3)1e-9)# True7.2 可变对象的默认参数# ❌ 错误defadd_item(item,items[]):items.append(item)returnitemsprint(add_item(1))# [1]print(add_item(2))# [1, 2] - 意外# ✅ 正确defadd_item(item,itemsNone):ifitemsisNone:items[]items.append(item)returnitems7.3 vs is# 比较值# is 比较身份内存地址# 总是用 比较值print([1,2,3][1,2,3])# True# 用 is 比较 Noneprint(NoneisNone)# True# 不要用 is 比较值print(1000is1000)# 可能 False八、本章小结变量是对象的引用不是存储数据的盒子Python 有八大基本数据类型分为可变和不可变不可变对象int、float、str、tuple、bool可变对象list、dict、setPython 通过小整数池和字符串驻留优化性能使用is比较对象身份比较值浮点数比较使用math.isclose()九、课后练习编写程序交换两个变量的值不使用临时变量实现一个简易计算器支持加减乘除和取余探究创建两个内容相同的列表验证is和的区别编写程序将用户输入的秒数转换为时:分:秒格式下篇预告第 3 篇《字符串 —— 不只是文本那么简单》—— 深入探索 Python 字符串的强大功能揭秘编码问题的终极解决方案。本系列文章首发于 CSDN转载请注明出处。