变量是什么
变量是一个计算程序用做存储信息所引用的。他们还提供一种标签数据与一个描述性的名称,所以我们的程序可以被读者和我们自己更清楚地理解。它有助于认为变量保存信息的容器。他们的唯一目的是标签和数据存储在内存中,这些数据将被你的程序所使用。
在计算机程序中,变量不仅可以是数字,还可以是任意数据类型, 在python中我们可以把各种类型的数据赋值给同一个变量,比如:
#!/usr/bin/env python3
# _*_ coding:utf-8 _*_
# Author: nockgod@gmail.com
# Date: 2017-07-28 10:30
# k1 存储内容为字符串"Good Boy"
k1 = 'Good Boy'
print(type(k1))
print("k1 output value is: %s" % k1)
print("****分割线****" * 8)
# K1 存储内容变为整形 100
k1 = 100
print(type(k1))
print("k1 output value is: %s" % k1)
运行结果为:
Python能自由改变变量类型的特征被称为动态类型。并不是所有的语言都支持动态类型。在静态类型的语言中,变量有事先说明好的类型。特定类型的数据必须存入特定类型的变量。相比于静态类型,动态类型显得更加灵活便利。
变量定义规范
声明变量
# _*_ coding:utf-8 _*_
name = "nock"
如上代码中声明了一个变量,变量名称为name,变量name的值为'nock'.
定义变量的规则
- 变量名只能是
字母
、数字
和下划线
的任意组合 - 变量名的第一个字符不能为
数字
以下关键字不能声明为变量(因为会跟Python内置关键字冲突):
['and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'exec', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'not', 'or', 'pass', 'print', 'raise', 'return', 'try', 'while', 'with', 'yield']
在Python3中 exec 不再是关键字,但 nonlocal 是一个新的关键字,还有一些这里就不一一枚举了。
**注:Python中变量对大小写敏感,也就是说Name和name是两个变量名
变量定义方式
驼峰写法:
CpuNumber = 8
CpuLoad = 5
下划线写法:
memory_used = 3
memory_free = 5
明眼人都能看出来下划线的方式更清晰,官方也是推荐使用下划线,当然你用驼峰法也是ok的,阿里的Python API接口示例变量名也是下划线定义,所以你应该选择哪种呢?
几个不好变量定义方式举例:
- 变量名过长
- 变量名意思表达不清晰
- 变量名为中文或者拼音
所以在实际的生产中不要害怕变量名有一定的长度,表意一定要清晰,切记不要使用中文和拼音,不要让人家去猜你变量的意思,适当的时候要注释,代码不是写给你一个人看的哦!
变量赋值详解
我们上面已经简单的说了声明变量,下面我们详细看看Python的变量赋值和其存在形式
#!/usr/bin/env python3
# _*_ coding:utf-8 _*_
# Author: nockgod@gmail.com
# Date: 2017-07-28 10:30
Name = 'nock'
Phone = ’13681042939‘
解释:当Python解释器解析到 Name = 'nock'的时候会在内存中开辟一个空间存放'nock'字符串,然后Name变量指向存储'nock'字符串的内存地址。
在内存中表示如下:
如果做了如下改变呢:
#!/usr/bin/env python3
# _*_ coding:utf-8 _*_
# Author: nockgod@gmail.com
# Date: 2017-07-28 10:30
Name = 'nock'
# 将变量Phone指向了Name变量的内存地址
Phone = Name
在内存中表示如下:
我们再来变一下呢:
#!/usr/bin/env python3
# _*_ coding:utf-8 _*_
# Author: nockgod@gmail.com
# Date: 2017-07-28 10:30
Name = 'nock'
# 将变量Phone指向了Name变量的内存地址
Phone = Name
# 将变量Name指向改为'lucky',但是变量Phone并没有改变
Name = 'lucky'
在内存中表示如下:
总结:
其实变量名字我们可以想象为一个大厦里面各个房间的门牌标,有个门上可能贴着两个门牌标签,但是当里面的内容变了,它才代表是另外一个另外一个空间了。如果你的内容没有变化,你还是在固定的空间中。
垃圾回收机制
在Python基础中有一个比较重要的概念那就是垃圾回收机制,通常大家比较忽略这个概念,当然变量内存空间的回收也包括在里面,下面我们通过代码来验证一下:
>>> a = 1
>>> b = a
>>> id(a), id(b)
(4345374736, 4345374736)
如上所示,首先我们声明了变量a,且赋值为1,然后又声明变量b,设置b等于a,通过之前变量复制详解我们知道其实b和a指向了同一个内存空间,所以我们通过id()这个内置函数可以清楚的看到两个变量的内存地址区域是相同的。
我们再来看看如下代码示例:
>>> name = 'nock'
>>> name = 'lucky'
>>> print(name)
lucky
通过上面这个示例,我们可以大概的来理解一下垃圾回收机制是如何工作的:
- 创建一个变量name,指向'nock'的内存地址;
- 如果'nock'这个值之前没有在内存中创建,那么现在创建它,并让这个内存地址的引用数+1,此时等于1;
- 然后我们对变量name进行重新赋值,让其执行'lucky'的内存地址;
- 那么此时'nock'值的引用数现在就变成0了,当Python一旦检测到某个内存地址的引用数为0时,就会把这个内存地址给删掉,从而释放内存空间。
- 最后变量name执行了'lucky’的内存地址空间,所以name就等于'lucky'了。
当然这里我们也可以主动清理变量释放内存,在Python中有一个内置函数del(),他可以删除你定义的变量,如下所示:
>>> name = 'nock'
>>> name = 'lucky'
>>> print(name)
lucky
>>> id(name)
4349044808
>>> del(name)
>>> id(name)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'name' is not defined
常量
说了这么久变量,我们来说说常量,常量又是什么鬼,常量通常指不变的量,如π 3.141592653..., 或在程序运行过程中不会改变的量。
举例说明,我们每个人的年龄随着时间的退役都会增加,那年龄就是一个变量;比如我们都认为的10.1号是国庆节,那这个日期就是一个常量。
在Python中有一个专门的语法代表常量,Python程序员都约定俗成把变量名全部大写代表常量
NATIONAL_DAY = '10-01'
好到这里我所了解的Python的变量的所有知识到这里就写完成了,希望读到这里的朋友,你有所收获。