一、变量

1.1什么是变量

变量的字面意思:变化的量;

我们的理解:

  • 量:记录现实世界中的状态,让计算机能够像人一样去识别世间万物。

  • 变:现实世界中的状态是会发生改变的。

1.2为什么要有变量

计算机问什么要有变量的概念?其实计算机中的程序的运行就是一系列状态的变化。

1.3 定义变量

变量定义的案例:

name = 'nick'
age = 19
gender = 'male'
height = 180
weight = 140

1.4变量的组成

变量的组成由下面三个部分组成:

  1. 变量名:变量名用来引用变量值,但凡需要用变量值,都需要通过变量名。

  2. 赋值符号:赋值。。

  3. 变量值:存放数据,用来记录现实世界中的某种状态。

1.5 变量的命名规则:

对于一个变量,你想怎么命名就怎么命名。那样没有任何的问题,不会影响结果,但是在老板检查代码后,你就会被炒鱿鱼。

一定要记住,定义一个变量其实在记录现实世界中的状态,并且存永远不是目的,取才是目的。所以变量的命名应该满足以下的三个规范:

  1. 变量名应该能够反映变量值所描述的状态,切不可用中文;

  2. 变量名必须用字母数字下划线组合,并且并且变量名的第一个字符不能是数字;

  3. 关键字不能声明为变量。

部分关键字:

['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']

1.6变量名的两种风格

驼峰体

AgeOfNick = 19
print(AgeOfNick)

下划线

age_of_nick = 19
print(age_of_nick)

二、常量

变量是变化的量,常量是不变的量。但是在python中没有使用语法强制定义常量,也就是说,python中定义的常量本质就是变量。如果非要定义常量,变量名必须全大写。

AGE_OF_NICK = 19
print(AGE_OF_NICK)

如果是常量,那就没有必要更改,所以python就只制定了一个规范,而没有制定常量的语法,因此常量也是可以修改的,但不建议。

三、Python变量内存管理

3.1变量存在哪?

当我们在文件p1.py中定义了一个变量x=10,那么一但程序运行计算机就会把这个变量值存在内存中当中。说具体点就是对于计算机内存这个大内存,每定义一个变量就会在这个大内存中开辟一个小的空间来存放变量的变量值。然后内存给这个小空间一个变量名x,x指向10.

3.2Python垃圾回收

对于p1.py,如果我们再加上一段代码x=11,大内存会开辟另外一个小空间存储变量值11,把变量值绑定另一个门牌号x,但是由于之前有x,所以大内存会解除x与10的连接,让x与11连接。这个时候10由于没有了门牌号,所以成为了python眼中的垃圾,python就会处理这个垃圾,释放10的内存空间,这就是python的垃圾回收机制。而其他语言需要手动吧10的内存占用释放掉。

3.2.1 引用计数

从上述的解释我们可以知道只要某个变量值绑定着门牌号,就不是垃圾,反之变量值没有绑定门牌号,这个变量值就是垃圾,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的内存占用

上述代码就是一个引用计数加减的过程。

3.3小整数池

对于上面讲的引用计数,需要注意的是:Python实现int的时候有个小整数池。为避免因创建相同的值而重复申请内存空间所带来的的效率问题,Python解释器会在启动时创建小整数池,范围是[-5,256],该范围内的小整数对象是全解释器范围内被重复使用,永远不会被垃圾回收机制回收。

在pycharm中运行Python程序时,pycharm出于对性能的考虑,会扩大小整数池的范围,其他的字符串等不可变的类型也都包含在内便采用相同的方式处理了,我们只需要记住这是一种优化机制,至于范围到底多大,不用必细究。

四、变量的三个特征

对于每个变量,python都提供了这三个方法分别获取变量的三个特征,其中python的内置功能id(),内存地址不一样,则id()后打印的结果不一样,因为每一个变量值都有其内存地址,而id是用来反映变量值在内存中的位置,内存地址不同则id不同

x = 10
print(x)  # 获取变量的变量值
print(id(x))  # 获取变量的id,可以理解成变量在内存中的地址
print(type(x))  # 获取变量的数据类型,下章会详细介绍数据类型

4.1 打印(一)

x = 10
print(x)  # 获取变量的变量值

运行结果:10

4.2判断变量值是否相等用(二)

name1 = 'egon'
name2 = 'nick'
print(name1 == name2)  # False

运行结果:False

4.3判断变量id是否相等(三)

x = 11
y = x
z = 11
print(x == y)  # True

运行结果:True

print(x is y)  # True

运行结果:True

print(x is z)  # True,整数池的原因

运行结果:True

x = 257
z = 257

print(x is z)  # False

运行结果:False

从上诉的打印消息可以看出:id相等的变量,值一定相等,指向的是同一个内存地址;值相等的变量,id不一定相等。

其中在第一次打印print(x is z)的时候就触发了上一章讲的整数池。这可以理解成python的优化机制,11的值本身不大,并且由于我们快速的再一次使用了11,再由于申请内存空间需要计算机开销,因此python让x和z都指向同一个11。因为存不是目的,取才是目的,这样进行优化的话并不会影响程序的运行。

五、花式赋值

5.1 链式赋值

代码示例:

代码示例:

a = 10
b = 10
c = 10
d = 10
print(f'a:{a}, b:{b}, c:{c}, d:{d}')

运行结果: a:10, b:10, c:10, d:10

a = b = c = d = 10
print(f'a:{a}, b:{b}, c:{c}, d:{d}')

运行结果:

a:10, b:10, c:10, d:10

5.2 交叉赋值

代码示例:

x = 100
y = 200

temp = x
x = y
y = temp
print(f'x:{x}')
print(f'y:{y}')

运行结果:

x:200 y:100

x, y = y, x
print(f'x:{x}')
print(f'y:{y}')

运行结果:

x:100 y:200

六、注释

6.1单行注释

单行注释用 #

# 单行注释

6.2 多行注释

多行注释用三对单/双引号,使用三引号注释可以换行。

代码示例:

'''
三单引号注释
三单引号注释
'''

"""
三双引号多行注释
三双引号多行注释
"""

 

posted on 2019-07-29 16:09  hanyi12  阅读(131)  评论(0编辑  收藏  举报