什么是变量?
变:现实世界中的状态是会发生改变的
量:记录现实世界中的状态,让计算机能够像人一样去识别世间万物
定义变量
name = 'nick'
age = 19
gender = 'male'
height = 180
weight = 140
变量的组成
- 变量名:变量名用来引用变量值,但凡需要用变量值,都需要通过变量名。
- 赋值符号:赋值
- 变量值:存放数据,用来记录现实世界中的某种状态。
变量的命名规范
- 变量的命名应该能反映变量值所描述的状态,切记不可用中文
- 变量名必须用字母数字下划线组合,并且变量名的第一个字符不能是数字。
- 关键字不能声明为变量名
变量的两种风格
- 驼峰体
AgeOfNick = 19
print(AgeOfNick)
19
- 下划线(推荐)
age_of_nick = 19
print(age_of_nick)
19
变量是变化的量,常量则是不变的量。python中没有使用语法强制定义常量,也就是说,python中定义常量本质上就是变量。如果非要定义常量,变量名必须全大写。
AGE_OF_NICK = 19
print(AGE_OF_NICK)
19
AGE_OF_NICK = AGE_OF_NICK + 1
print(AGE_OF_NICK)
20
如果是常量,那就没必要更改,所以python就只制定了一个规范,而没指定常量的语法,因此常量也是可以修改的,但不建议。
- 变量存储在内存中
- Python垃圾回收机制(如果变量新取值,旧值贼会被释放掉)
- 引用计数
x = 10 # 10引用计数加1为1
y = x # 10引用计数加1为2
x = 11 # 10引用计数减1为1;11引用计数加1为1
del y # 10引用计数减1为0,触发python垃圾回收机制,python清理10的内存占用
# 测试
>>> x = 10
>>> y = x
>>> x = 11
>>> y
10
>>> del y
>>> y
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'y' is not defined
>>> x
11
- 小整数池
对于上一节讲的引用计数,需要注意的是:Python实现int的时候有个小整数池。为了避免因创建相同的值而重复申请内存空间所带来的效率问题, Python解释器会在启动时创建出小整数池,范围是[-5,256],该范围内的小整数对象是全局解释器范围内被重复使用,永远不会被垃圾回收机制回收。
在pycharm中运行python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变类型也都包含在内一便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,无需细究。
python内置函数:id()
通过这个函数可以获取某一个变量所在的内存地址
>>> year = 2021
>>> print(id(year))
140201597743824
>>>
python内置sys模板中的函数:getrefcount()
获取某一个变量的引用计数(getrefcount输出值默认从3开始)
>>> import sys
>>> year = 2021
>>> print(sys.getrefcount(year))
2
>>> toyear = year
>>> print(sys.getrefcount(year))
3
>>> yesyear = year
>>> print(sys.getrefcount(year))
4
>>> del yesyear
>>> print(sys.getrefcount(year))
3
>>> print(sys.getrefcount(111111))
3
>>> num = 111111
>>> print(sys.getrefcount(111111))
3
>>> num_1 = 111111
>>> print(sys.getrefcount(111111))
3
>>> num_2 = num_1
>>> print(sys.getrefcount(111111))
3
>>> print(sys.getrefcount(num_1))
3
>>> print(sys.getrefcount(num))
2
在Python中让引用计数增加共有三种方法:
- 变量被创建,变量值引用计数加1
- 变量被引用,变量值引用计数加1
- 变量作为参数传入到一个函数,变量值引用计数加2
- 打印
>>> x = 10
>>> print(x) # 获取变量的变量值
10
- 判断变量值是否相等
>>> name = 'ysy'
>>> name2 = 'yqq'
>>> print(name == name2)
False
- 判断变量id是否相等
>>> x = 11
>>> y = x
>>> z = 11
>>> print(x == y)
True
>>> print(x is y)
True
>>> print(x is z) # True,整数池的原因
True
>>> x = 257
>>> z = 257
>>> print(x is z)
False