为什么在python中不需要像c语言一样先声明对象的类型再对变量进行初始化呢?这就涉及到了python的动态类型
例子:
>>> a=3
当使用变量a来代表3时python会执行三个步骤:
1、分配内存空间来创建一个对象存储值3
2、创建一个变量a,如果还没被创建的话
3、将变量a与对象相连接
变量在赋值的时候才被创建,它可以引用任何类型的对象。变量实际上是到对象内存空间的一个指针。
类型属于对象而不是变量在python中,对象有两个标准的头部信息:
(1)类型标志符:标示着这个对象的类型
(2)引用计数器:记录有多少个变量引用这个对象
变量名没有类型,类型属于对象。
垃圾回收机制()当一个变量名被赋予一个新的对象,如果原来的对象没有被任何变量名所引用的话,之前对象占用的空间将被回收。
>>> x=42 >>> x='liu'
当变量x被连接到新的对象上时,之前的对象42将被清除。
对象的垃圾回收是通过引用计数器来实现的。当引用计数器为0时此对象将被清除。
共享引用与对象的修改共享引用要求两个不同的变量能够引用同一个对象,指向相同的内存空间。
例子:
>>> L1=[1,2,3,4] >>> L2=L1 >>> L2[1]=5 >>> L1 [1, 5, 3, 4] >>> L2 [1, 5, 3, 4]
当L1与L2指向同一个对象时,通过L2改变第二个数的值,通过L1显示也发现改变了。这是因为通过变量修改了对象内存空间里的值,两个变量指向同一块内存空间,所以通过一个变量修改值,另一个变量也会显现出修改后的状态。
这种行为仅支持原位置可改变的可变对象,如列表、字典等,但当对象是字符串或数字时,不能进行修改。
在程序中应当尽量避免出现上述例子的情况,可以使用copy()方法来复制一个对象,复制后的对象与原对象在不同的内存空间。
>>> L1=[1,2,3,4] >>> L2=L1.copy() >>> L2[1]=5 >>> L1 [1, 2, 3, 4] >>> L2 [1, 5, 3, 4]
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)