Python-变量、变量作用域、垃圾回收机制原理-global nonlocal

变量实现原理决定了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()
# 变量好,生的巧,生在模块定全局,生在局部定函数,循环分支管不着,要想变,定官印,出了范围不见了,找它还得上级找
Python-变量、变量作用域、垃圾回收机制原理-global nonlocal的更多相关文章
- 图解 CMS 垃圾回收机制原理,-阿里面试题
最近在整理JVM相关的PPT,把CMS算法又过了一遍,每次阅读源码都能多了解一点,继续坚持. 什么是CMS CMS全称 ConcurrentMarkSweep,是一款并发的.使用标记-清除算法的垃圾回 ...
- JavaScript--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)
一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...
- JS--我发现,原来你是这样的JS(四)(看看变量,作用域,垃圾回收机制是啥)
一.介绍 这是红宝书(JavaScript高级程序设计 3版)的读书笔记第四篇,是红宝书第四章内容(主要是变量和作用域问题),当然其中还有我个人的理解.红宝书这本书可以说是难啃的,要看完不容易,挺厚的 ...
- python之MRO和垃圾回收机制
一.MOR 1.C3算法简介 为了解决原来基于深度优先搜索算法不满足本地优先级,和单调性的问题. python2.3版本之后不管是新式类还是经典类,查找继承顺序都采用C3算法 2.算法原理 C3算法的 ...
- JVM 及 垃圾回收机制原理
JVM Java 虚拟机 Java 虚拟机(Java virtual machine,JVM)是运行 Java 程序必不可少的机制.JVM实现了Java语言最重要的特征:即平台无关性.原理:编译后的 ...
- python 全局变量与局部变量 垃圾回收机制
掌握L.E.G.B(作用域) 掌握局部作用域修改全局变量 步骤- 1.命名空间和作用域 命名空间:变量名称与值的映射关系作用域:变量作用的区域,即范围. 注意:class/def/模块会产生作用域:分 ...
- .Net 垃圾回收机制原理(二)
英文原文:Jeffrey Richter 编译:赵玉开 链接http://www.cnblogs.com/yukaizhao/archive/2011/11/25/dot_net_GC_2.html ...
- .Net 垃圾回收机制原理(一)
英文原文:Jeffrey Richter 编译:赵玉开 链接:http://www.cnblogs.com/yukaizhao/archive/2011/11/23/dot_net_GC_1.html ...
- 【译】.Net 垃圾回收机制原理(转)
上一篇文章介绍了.Net 垃圾回收的基本原理和垃圾回收执行Finalize方法的内部机制:这一篇我们看下弱引用对象,代,多线程垃圾回收,大对象处理以及和垃圾回收相关的性能计数器. 让我们从弱引用对象说 ...
随机推荐
- OGG复制进程延迟高,优化方法二(存在索引),SQL选择不好的索引
https://www.cnblogs.com/lvcha001/p/13469500.html 接前序,本次场景中有索引,但是OGG复制进程使用了低效率的索引? 类似SQL使用低效索引,如何让Or ...
- JavaScript中pipe实战
JavaScript中pipe原理 代码示例 const pipe = (...fns) => x => fns.reduce((y, f) => f(y), x); 原理 一行代码 ...
- element UI dialog 固定高度 且关闭时清空数据
解决方法:在dialog里写一个div ,div的大小设置为相对视窗的大小就行 <el-dialog title="xxx" :visible.sync="dial ...
- 使用【QQ五笔的码表】转成【百度手机自定义码表】
使用[QQ五笔码表]转成[百度手机自定义码表] QQ五笔码表先转成多多格式. 这里选用极点>>多多. 然后去掉空格. 转成GB.去掉没的字. 百度要的是这种格式. 现再用点讯工具转成 de ...
- 痞子衡嵌入式:导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是导致串行NOR Flash在i.MXRT下无法正常下载/启动的常见因素之SFDP. i.MXRT系列MCU发布已两年多了,基于i.MXR ...
- 总结回顾js arr的常见方法以及相关的使用场景(一)
Array对象方法 1.arr.concat() 连接两个或更多的数组,并返回结果. 连接数组中的值 连接两个数组 连接三个数组 2.arr.join() 把数组的所有元素放入一个字符串.元素通过指定 ...
- Left Mouse Button (bfs)
Mine sweeper is a very popular small game in Windows operating system. The object of the game is to ...
- KUDU 学习笔记
Kudu 现存系统针对结构化数据存储与查询的一些痛点问题,结构化数据的存储,通常包含如下两种方式: 静态数据通常以Parquet/Carbon/Avro形式直接存放在HDFS中,吞吐能力大,适合离线分 ...
- 在Oracle中快速创建一张百万级别的表,一张十万级别的表 并修改两表中1%的数据 全部运行时间66秒
万以下小表做性能优化没有多大意义,因此我需要创建大表: 创建大表有三种方法,一种是insert into table selec..connect by.的方式,它最快但是数据要么是连续值,要么是随机 ...
- 下载安装gradle
1.登录官网:www.gradle.org,进入到下图的界面: 2.点击Install Gradle,跳转到下一个界面后: 3.下载 4.下载成功后,解压到任意位置,将路径添加到path路径下,选择我 ...