Python的对象类型
2023-06-22 11:11:22 10 举报
AI智能生成
Python的对象类型
作者其他创作
大纲/内容
Python的变量名逻辑
可以将Pyhton的变量名视为指向特定值的引用
当赋值给一个变量时,你实际上是在告诉Python让这个变量名引用一个特定的对象
因此可以让一个变量引用任何类型的对象
语言区别
这点和C++不太一样
C++的变量名本质也是对内存位置的引用,但是在默认情况下直接存储值
也就是说C++的变量名和内存空间基本是一一对应的关系
从而C++的赋值和复制行为完全不同
C++行为是深拷贝并且直接修改赋值
而JS是两者的综合
对于原始数据类型,如数字、字符串、布尔值等是直接存储
对于对象、数组和函数是引用
不可变对象
基本定义
一旦创建就不能改变的对象
如果试图改变一个不可变对象的值,实际上会创建一个新的对象
基本类型
整数(int)
浮点数(float)
布尔值(bool)
字符串( str)
元组(tuple)
地址获取
当我们在内部定义域的时候,不能修改外部的不可变对象值
因为修改不可变对象值的时候,Python会认为我们在修改局部变量,从而在局部变量符号表中找这个值,最后返回错误。
但是可以在内部用新变量引用外部变量,或者使用nonlocal表示我们的变量不是内部变量
修改逻辑
过程
创建新对象
Python首先会为新的值创建一个新的对象。这个新对象的类型和你要改变的对象的类型相同
分配内存
Python会在内存中为新的对象分配一块空间
更新变量指针
Python会将你的变量的指针从旧的对象更新为新的对象。这意味着你的变量现在指向的是新的对象,而不是旧的对象
释放旧对象
如果没有其他变量或数据结构引用旧的对象,Python的垃圾收集器会自动释放旧对象的内存空间
示例
这里a首先获得一个"hello"字符串的引用
然后将b和a引用同一个对象
然后改变a的引用对象,引用为新定义的"world"
所以字符串不支持元素赋值
可变对象
基本定义
可以在不改变对象本身的情况下改变其值的对象
基本类型
列表(list)
字典(dict)
集合(set)
地址获取
当对象是可变变量的时候,无论在那一层,对象都会按照获取地址的规则获取
修改逻辑
过程
获得对象地址
Python获取对象的内存地址(id())
解析地址获取对象
Python的解释器找到与变量名对应的内存地址,然后在内存中找到这个地址对应的对象。
修改元素值
Python根据你访问或修改的元素的索引找到对应的内存地址,最后在这个地址找到或修改元素的值
底层实现
Python中的每个对象都有三个属性
类型
值
标识(id)
可以认为是对象在内存中的地址
Python的解释器会解析变量的作用域
不可变对象的标识和值在其生命周期内都是固定的,而可变对象的标识是固定的,但其值可以改变
Python的解释器使用一个内部数据结构(例如哈希表)来跟踪所有的变量和它们引用的对象的内存地址
修改逻辑
当修改了一个不可变对象变量名的时候,不改变其他指向这个对象的变量名
当修改了一个可变对象的变量名的时候,改变其他指向这个对象的变量名
这种设计使得Python可以在处理大型数据结构时更加高效
0 条评论
下一页