在讲Python变量前,了解一下Python内部运行的环节:
Python代码到机器码,中间经过了解析器和PVM
解析器:对Python代码进行了编译,编译成字节码的内容,字节码以*.pyc结尾
PVM:字节码再编译成机器码,
1. Python的概念层级
概念层级即程序
表达式:创建、处理对象
语句:建立在表达式之上
模块:语句太多,放到一起形成模块
程序:模块也不止一个,
2. 变量
Python的变量前面没有写类型,类型由实际类型值决定
变量概述
变量名:a和name
对象:具体的值,如20.0 ‘Tom’
系统类型:Python系统内部维护的类型
引用:a指向Tom的箭头就是引用,
Python数据类型只与对象有关 与变量名无关
变量的创建
第一次赋值的时候创建,以后可以改变类型
创建规则
包含字母、数字、下划线,
只能以字母或下划线开头,
不能有空格,
尽量避免Python关键字或函数名
简短且有描述性
区分特殊符号,1,l,0,o
Python变量名建议下划线分割
变量的类型
变量无类型约束
类型取决于关联变量
变量的使用
用type(name)查看变量类型
用id(name)查看放在内存哪里
垃圾回收
Python自动释放未被引用的对象
内部原理依据对象引用计数器统计的数值
举例:变量a先引用20,然后再引用Jerry,那么对象20就会成为被回收的内容,垃圾回收GC会回收20 (一般情况下)变量有计数器 counter=0时可以回收
共享引用:
简单理解就是多个变量引用一个对象
细节:判断字面值是否相等,==
判断内存地址是否一样,is
Python中256以下整数,已被python缓存,目的提高效率
例子1:共享引用一般举例——让a和b同时引用Jerry,查看内存地址id()值一样
例子2:共享引用小整数20——age和score的id()值一样
例子3:共享引用大整数3100——内存地址不一样
解释原因:
说明一点:Python3中int是无限的只要内存能支持整数可以无限大,所以3100内存不一致不是因为整数大小有关。
程序语言中定义数据类型都是为了便于程序,如方便我们合理利用内存。
Python处理机制,认为我们经常会用到一些小的数字,以256为界限,256以下的值在内存中都有一份,所以上面20都是一个内存地址而3100为两个内存地址
如果我们想查看20在内存中有多少次被引用呢,可以调用一个模块的方法,sys(system的简写) 用import sys导入该模块,下面有一个方法sys.getrefcount(20)