动态类型以及它提供的多态性,无疑是Python语言简洁性和灵活性的基础。
一、变量
<1>变量创建
一个变量a,当代码第一次给它赋值时就创建了它,之后的赋值将会改变已创建的变量名的值。
<2>变量类型
变量永远不会有任何的和它关联的类型信息或约束。变量原本是通用的,它只是在一个特定的时间点,简单的引用了
一下特定的对象而已。
<3>变量使用
当变量出现在表达式中,它会马上被当前引用的对象所替代(对象是有类型的)。此外所有的变量必须在使用前明确的
赋值,使用未赋值的变量会发生错误。
总而言之,变量在赋值时才创建,它可以引用任何类型的对象,并且必须在引用前赋值。
例如 a = 3
会经历三个步骤:
<1>创建一个对象来代表值3
<2>创建一个变量a
<3>将变量与新的对象相连接
因此可得
对象是分配的一块内存,有足够的空间去表示它们所代表的值。
变量是一个系统表的元素,拥有指向对象的连接的空间。
引用是自动形成的从变量到对象的指针。
二、类型属于对象,而不是变量
对一个变量多次赋值得,
>>> a = 3
>>> a = ‘hello‘
>>> a = 3.1415
由此可见变量名是没有类型的,而类型是属于对象的。我们对a的修改只是让它成为不同对象的引用。对象是有类型
的,整数对象3包含值3以及一个头部信息,告诉python这是一个整数类型。
三、对象的垃圾收集
在python中,当一个变量名被赋予一个新的对象,之前的那个对象占用的空间就会被回收(如果它没有被其他变量引
用),称为垃圾收集。
在内部python是这样来实现这一功能的:
它在每个对象中保持了一个计数器,记录了当前指向该对象的引用的数目,一旦这个计数器的值为0,这个对象的内
存空间会自动回收。这意味着不需要考虑内存释放等问题,省去大量的基础代码。
四、共享引用
例:
>>> a = 3
>>> b = a
此时a,b都成为对象3的一个引用,叫做共享引用。
>>> a = ‘hello‘
当a改变时,这时不会改变b的值,只是a修改为‘hello‘的引用而已。
给变量赋一个新的值,不是替换了原始的变量,而是让这个变量去引用完全不同的另一个对象,效果就像重新赋值一
样,仅仅会影响被赋值的变量。
五、共享引用和原处修改
有一些对象和操作确实会在原处改变对象,例如之前写过的"Python<1>list",进行一些操作时不是生成一个新的对
象,而是直接修改了自身引用的对象,此时共享引用需要加倍小心。如果你不想要这样的现象发生,需要python拷贝
对象,而不是创建引用。最常见的办法就是从头到尾的分片。
>>> L1 = L2[:]
此时对其中一个的修改不会影响另一个,两个对象在不同的内存区域。
参考<<learning python>>
Python<9>动态类型简介