大家学习的时候,可类比我们第二学期第一季 课程。
# 一、 变量
# 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的整数,当程序运行的时候,如果需要申请内存空间,并且值在这个范围内,那么就直接从池子里面取,而不是重新申请内存空间,因此a和b的内存地址是一样的,所以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没有常量的概念,只是约定俗成而已。