变量实现原理决定了Python使用的垃圾回收机制为变量引用计数,当这个对象引用计数为0时候,则会自动执行__del__函数回收资源, del方法只是把变量指向的对象引用计数减一而已并删除这个变量
表达式: 运算符和操作符所构成的序列
什么是变量?
一种抽象,计算机用来保存现实数据的容器,通过这个变量抽象可以写入现实数据到计算机中,并且可以读取变量取到保存到计算机中的现实数字化数据
在Python中变量名只是一个符号,而不是一个内存区块
names = ("BeiMenChuiXue", "QiNiuYun") # 在动态语言中这样是可以的,但是在静态语言中这样会报错 names = ("XiMenChuiFeng", "AliYun") print(names)
Python变量赋值
name = "beimenchuixue" age = 18 height = 175 # 并无关键字也不需要定义变量类型,直接通过 = 进行赋值
变量类型
1. 满足存储单个现实数据
整形 int
浮点型 float
bool型 True(=1) False(=0)
字符串 str
2. 满足存储多个现实数据或归档现实数据
列表 list
元组 tuple
字典 dict
集合 set
变量强制转换
1. 浮点型 <> 整形,可能精度丢失
int_num = 123456 float_num = 12.333 int_str = "123456" float_str = "12.333" print(int(float_num), float(int_num)) print(int(int_str), float(float_str))
2. 字符转数字,需要做异常处理
3. 其他类型装字符 str() format() format_map()
int_num = 123456 float_num = 12.333 bool_num = True print("int_num: %s, float_num: %s, bool_num: %s" % (int_num, float_num, bool_num)) print("int_num: {int_num}, float_num: {float_num}, bool_num: {bool_num}".format(int_num=int_num, float_num=float_num, bool_num=bool_num)) print("int_num: {int_num}, float_num: {float_num}, bool_num: {bool_num}".format_map({ "int_num": int_num, "float_num": float_num, "bool_num": bool_num })) print(str(int_num), str(float_num), str(bool_num))
变量命名规范
1. 不能数字开头,大小写字母、下划线、数字
2. 不能使用保留关键字和内置方法命名
3. 区分大小写
变量命名要求
1. 命名知其意
2. 简单的英文单词来标明一个变量,要么全部中文拼音,要么全部英文
3. 用 _ 来区分两个单词
Python变量本身没有类型,赋值后才有类型
值类型
一旦定义不能修改(变量指向的值不能修改只能重新定义) int float bool str tuple
引用类型
定义之后可以修改(变量指向值可以动态修改) list dict set
查看变量内存地址 hex(id())
多维度访问
[index][index][index]
常量
不位于函数、类中变量(一旦定义禁止修改), 约定全部大写,本质上是全局变量
变量作用域(变量有效范围),作用域链(逐层向上找变量)
1. 全局变量,定义在模块中,作用于模块或整个应用程序
name = "北门吹雪" def bei_men_chui_xue(): print(name) return bei_men_chui_xue()
2. 局部变量,定义在函数中,仅仅作用在函数内部,函数会首先找局部变量
name = "北门吹雪" def bei_men_chui_xue(): name = "beimenchuixue" print(name) return bei_men_chui_xue()
3. 只能修改同一作用域的变量,可以访问上级变量但不可修改,修改通过 global 和 nonlocal(闭包中使用)声明
name = "北门吹雪" def bei_men_chui_xue(): # 申明name是全局变量 global name print(name) # 修改全局变量 name = "beimenchuixue" return bei_men_chui_xue() # 全局变量已改,不推荐如此做,因为全局变量在很多地方调用并使用 print(name)
def go_run(start): def step(step): # 申明start不是当前局部变量 nonlocal start start += step return start return step run = go_run(0) # 跑了3步 total_run = run(3) print(total_run) # 又跑了5步 total_run = run(5) print(total_run)
4. 变量作用域 全局、def 函数
5. if + while + for 不能形成作用域, 其他语言如Golang中会形成作用域
def bei_men_chui_xue(): name = "beimenchuixue" # if 分支 if name == "beimenchuixue": age = 18 # 访问if分支中的变量 print(age) return bei_men_chui_xue()
# 变量好,生的巧,生在模块定全局,生在局部定函数,循环分支管不着,要想变,定官印,出了范围不见了,找它还得上级找