Python黑魔法揭秘:为什么说“万物皆对象”?
你好呀,Python爱好者! 你是否曾听大佬们说“Python里连数字都是对象”? 今天,我们就来聊聊这个让新手懵圈、老手直呼内行的 “一切皆对象” 哲学!
一、一个让新手怀疑人生的例子
先看这段代码:
a = 5
b = 5
print(a is b) # 输出啥?True还是False?
答案:True!
惊不惊喜?连数字5都不是“值”,而是内存中的某个神秘对象!这背后的秘密,正是Python的对象模型。
二、解剖Python对象:身份证、户口本和肉身
Python中每个数据(是的,每一个!)都是对象,自带三大“基因”:
- 身份证号:id(obj),代表对象的内存地址,独一无二!
- 户口类型:type(obj),决定对象能干啥(如int会加减乘除)。
- 肉身数据:对象存储的具体值,比如5或"hello"。
举个栗子:
s = "信息科技云课堂"
print(id(s)) # 输出一串神秘数字:对象的“家门牌号”
print(type(s)) # <class 'str'>,原来是字符串家族!
print(s.upper()) # "码农人生"变身大写?错!中文表示不背这锅
三、变量?只是对象的“快捷方式”!
重要结论:变量不是“盒子”,而是对象的“贴纸”!
- 执行a = 1000时,Python在内存中创建了一个int对象,然后给这个对象贴上了a的标签。
- 再执行b = a,不过是把同一张对象贴纸复制给了b!
a = 1000
b = a
print(id(a) == id(b)) # True,贴纸指向同一个对象!
四、颠覆认知:这些居然全是对象!
你以为只有数字和字符串?格局打开!
函数是对象:能当参数传递、能赋值给变量!
类是对象:类本身是type类的实例(元类黑魔法的基础)
模块是对象:import numpy后,numpy也是个对象!
None是对象:它是NoneType家的独苗!
def 唱首歌():
print(" 爱你孤身走暗巷~")
唱歌 = 唱首歌
唱歌() # 输出歌声!函数对象被“转手”了
print(type(int)) # <class 'type'>,int类竟是type类的孩子!
五、对象分两种:钢铁直男与变形金刚
o 钢铁直男(不可变对象):int, str, tuple。
试图修改?不!直接造个新对象。
a = 5
a += 1 # 新对象诞生,旧对象原地去世(可能)
o 变形金刚(可变对象):list, dict。
原地变身,内存地址不变!
lst = [1, 2]
lst.append(3) # 还是那个lst,但内涵变了!
六、灵魂拷问区
- 为什么a = 257; b = 257时a is b可能是False?
- 如何让函数“记住”上次调用的状态?(提示:可变对象妙用)
- (评论区等你提问!)
七、为什么关心“万物皆对象”?
o 写代码更高效:理解可变/不可变对象,避免Bug坑!
o 装X必备:面试时侃晕面试官!
o 掌握高阶玩法:装饰器、元类…这些骚操作全基于对象模型!
挑战任务:
在Python中运行这段代码,并思考为什么?
a = "hello"
b = "hello"
print(a is b) # 输出True还是False?