Python基础:变量与存储
变量的命名规则:只能包含字母、数字和下划线
只能以字母、下划线开头
不能包含空格
变量:对象的别名 不能与Python关键字相同
尽量简短
大小写敏感
创建:第一次赋值时生成
类型 描述数据形态及支持操作
Python动态类型
我们现在来解释一下Python变量的创建,所谓第一次赋值时生成是指我们在单独声明一个变量而不赋值时会产生变量命名错误,Python认为我们在定义一个变量时是为了使用它,而不是为了声明。这与C/C++/Java语言不同,这一特质是由Python语言的动态类型决定的
那么什么是Python的动态类型呢?在C/C++/Java等语言中,我们可以先声明一个变量的类型,在对这个变量赋值时必须要赋给相应的类型,如String name;那么我们就需要给name赋予String类型的值。而在Python中,我们要对变量直接进行赋值,如name="Tom",说明name是一个String类型的变量,number=90则number是一个数值型变量。所谓的动态类型是指变量的类型不是由变量决定的,而是由实际赋给变量的值决定的。Python是一种强类型的语言,并且具有动态特性
下面我们来看一下Python变量的存储问题
存储 对象有类型,存储在内存区域
变量本身无类型,变量名指向实际的对象
对象本身带有类型的声明以及引用计数器
共享引用,多个变量引用同一个对象。==判断字面值是否相等,is判断对象的地 址是否相等
垃圾回收机制 Python自动释放未被引用的对象
通过对象引用计数器统计引用
我们在Python程序中创建变量x=20,接下来分析该变量的存储过程:
①内存中开辟一段存储空间,分配一个值为20
②将x变量名称指向刚开辟的内存空间中的20这个对象
进一步,我们创建另一个变量y="Tom",则该变量的存储情况如下:
①在内存中开辟另一段存储空间,分配一个字符型的对象"Tom"
②将变量表中变量名为y的变量名称指向内存空间中的"Tom"对象
将x变量赋值x="Jerry",那么此时变量x的存储情况发生了怎样的变化?
①首先,在内存空间中开辟一个空间存储对象"Jerry"
②将x这一变量名称指向对象"Jerry"
此时定义一个变量z,赋值为z=“Tom”,则变量的存储情况如下:
我们来进行一个简单的测试,Python中有一个函数能够帮助我们判断变量在内存中的地址:
如图,我们发现y和z指向同一个对象,即这两个变量共享引用
接下来我们测试一下整型变量a和b
我们发现a和b之间也是变量的共享引用。那么,是不是只要变量的值相同时它们就是共享引用呢?接下来我们看两个例子:
从这里我们发现,并不是变量的值相同就是共享引用,这是为什么?
在Python中,0~255之间的整数对象已经被创建在内存中,而较简单的字符串也都被创建,较长的字符串由于组合的可能性比较多 ,并没有被创建
那么,没有被指向或引用的对象被怎么处理了?
Python内部有一个垃圾回收机制,在特定的时间会将没有被引用的对象回收,释放其所占用的资源。那么Python如何判断一个对象有没有被引用呢?这要靠Python内部的一个引用计数器,通过判断引用计数器的值是否为0来确定其是否被引用