大家学习的时候,可类比我们第二学期第一季 课程。

# 一、 变量

# 1. 注释

js注释
// 单行注释
/*
* 这是一个多行
* 块级注释
*/
python注释
# print("你好,迪丽热巴") # 单行注释 快捷键:ctrl + /

"""
print("你好,迪丽热巴")
print("你好,古力娜扎")
"""   三个英文状态单引号或者双引号,中间写内容

# 2. 变量

# 1. 遵循:先定义,后引用
name = "迪丽热巴"
print(name)

# 2. 变量的内存管理
# 我们通过js的学习知道,定义变量会占用内存空间,python也是一样,但内存空间大小是有限的
# 那么就涉及到一个问题,你申请内存空间要使用这是没有问题的,但是如果你不用呢,
# 那么就要记得把内存空间释放出来
# 这个我们在js里面也有讲过,就是用完变量之后,把变量置为null,
# 这样就可以把内存空间释放出来 (具体搜索文档:`内存问题`)
# 如果你用完之后都不释放,由于内存空间是有限的,导致内存最后可能被占满,
# 就产生了内存溢出,因此我们要防止内存溢出
# 防止内存溢出的操作就叫做内存管理,由于内存管理非常麻烦,于是python推出了一个内存管理机制
# 称之为:自动垃圾收集机制 (和js是一样的),只不过python是用引用计数的方式进行垃圾回收
# 简单讲一下引用计数(了解):
# 引用计数的增加
a = "迪丽热巴" 
# (这时候就申请了一个内存空间,把 "迪丽热巴" 存进去)
# (然后给这个内存空间绑定了一个变量 a,a指向的就是"迪丽热巴"的内存地址,引用计数为1)
# (接下来我把a的内存地址给b)
b = a
# (这时候a和b都指向了"迪丽热巴"的内存地址,引用计数为2)
# (接着我把a的内存地址给c)
c = a
# (这时候a和b和c都指向了"迪丽热巴"的内存地址,引用计数为3)

# 引用计数的减少
del a  # (表面上a被删除了,实际是解除了a与值"迪丽热巴"的绑定关系,此时"迪丽热巴"的引用计数减为2)
# print(a) # 报错
del b
# print(b) (表面上b被删除了,实际是解除了b与值"迪丽热巴"的绑定关系,此时"迪丽热巴"的引用计数减为1)
c = "古力娜扎" 
#(c重新赋值,也是解除了c与值"迪丽热巴"的绑定关系,此时"迪丽热巴"的引用计数减为0)
# (c重新指向新的内存地址,此时"古力娜扎"的引用计数加1)
# (那么此时"迪丽热巴"的引用计数减为0,我们再也不能通过变量名访问到"迪丽热巴"了)
# (此时"迪丽热巴"这个值就变成了垃圾值需要回收了,但这个回收不需要我们自己做)
# (python解释器给我们提供了一个功能,这个功能会一直扫码内存里面,有没有引用计数为0的,一旦发现,就立即回收这个值)
# (这就是python的垃圾回收机制)
print(c)


# 3. 变量命名规则
- 命名变量的时候,不能使用python的关键字
- 命名变量的时候,不能使用特殊符号,只能使用英文字母(大小写都可以)、数字、下划线,并且不能以数字开头
- 一般纯小写字母习惯于定义变量,纯大写字母习惯于定义常量

# 3. 变量值的两个重要特征:id与类型type

id 反应的是根据变量值的内存地址,所计算出来的id号码,注意,id不是内存地址,它是通过变量值的内存地址计算出来的,类似于它的身份证号码,可以理解成它是内存地址的映射。变量值的内存地址不一样,id也不一样。

name = "迪丽热巴"
# id
print(id(name))
# type
print(type(name))

# ① is 与 == 的区别

is 叫做 身份运算,用于比较左右两个值的身份是否相等,前面我们说到变量值的身份证号就是id号,所以 is 比较的是两个变量值的id是否相等,如果相等,则返回True,否则返回False。
注意:一个等号 = 就是赋值,两个等号 == 就是比较两个变量是否相等(js里面也是这样

"""
a = "迪丽热巴" # 给a划一块内存空间,把值"迪丽热巴"放进去
b = "迪丽热巴" # 重新给b划一块内存空间,把值"迪丽热巴"放进去
# 其实我们已经发现,a和b的内存空间不一样了,但是值是一样的
print(a , b)  # 迪丽热巴 迪丽热巴
print(id(a) , id(b)) #3228645659936 3228645659936 发现一样,是因为程序做了优化,我们应该用cmd运行
"""

# 以下代码在cmd运行
"""
# 如果不好赋值,则 `鼠标右键->属性->选项->勾上快速编辑模式`
a = "迪丽热巴"
b = "迪丽热巴"
print(a , b) # 迪丽热巴 迪丽热巴
print(id(a) , id(b)) # 2410845601536 2410845508656 不一样,因为内存地址不一样
"""

# is -- 比较的是两个变量值的id是否相等,即内存地址是否一样
# == -- 比较的是两个变量的值是否相等
# a is b # False
# a == b # True

# ② 小整数池的概念

按照我们上面说的,在cmd运行

a = 10
b = 10
id(a)
id(b)
a is b # 输出:True

按照我们上面讲的应该是 False才对啊,为何是True呢?
说明: 申请内存空间,把值存进去,这是一种写操作,就是我们常说的IO读写操作:不管往硬盘读写数据还是往内存读写数据。而我们CPU的运算速度是相当快的,比内存和硬盘都快,所以一旦程序有io操作,就会拖慢cpu的速度,因此python帮我们做了优化,叫 小整数池
为了避免因创建相同的值,而重复申请内存空间所带来的效率问题,python解释器会在启动的那一刻开始,创建出 小整数池,这个池子里面存放了 -5~256 的整数,当程序运行的时候,如果需要申请内存空间,并且值在这个范围内,那么就直接从池子里面取,而不是重新申请内存空间,因此 ab 的内存地址是一样的,所以 a is b 返回 True

a = 10
b = 10
id(a)  # 140703894555352
id(b)  # 140703894555352
c = 5 + 5
id(c)  # 140703894555352
# 发现a、b、c的id相同
a = 257
b = 257
id(a) # 2410845651856
id(b) # 2410845666832
a is b # 输出:False

当然python解释器不止有小整数池,还有 小浮点数池小字符串池等等,也做了同样的优化,但是在pycharm或者vscode运行python程序时,出于对性能的考虑,会扩大小整数池的范围,包括其它池都会扩大范围,所以你会发现在 cmd运行和在pycharm或者vscode运行 python程序时, a is b 的结果不同。其目的主要是做了优化,扩大了各种池的范围,从而提高效率。但最终项目上线还是以python解释器为准,pycharm或者vscode只是做开发的提高效率用的,我们只需要记住这是一种优化机制即可,至于范围有多大,我们不需要关心,因为python解释器会帮我们做这个事情。

# 4. 常量

常量在js中,用操作符 const定义,用得很广,但在python语法中,没有常量的概念。但是我们在开发的过程中会涉及到常量的概念,比如:圆周率 π,π的值是不会变的,不能说我在程序中把π的值改变了吧。但是python中,所有的量都是变量,于是python里就有一些约定俗成的东西,就是你可以把变量名称的所有小写字母换成大写字母,用来表示常量,这只是一种约定或者说规范,就是说程序员看到你的变量名全部大写,他就默认为这个东西表示的是常量,不应该去修改它,但是如果你就想改它,也没有问题,因为python没有常量的概念,只是约定俗成而已。

更新时间: 2025年5月23日星期五下午5点19分