块作用域
-------------------
1) Python **没有** 块级作用域
代码1:块作用域
~~~
# if/try/for 不会引入新的作用域
if True:
x = 1
print(x) # 1
for x in range(5):
pass
print(x) # 4
~~~
2) **只有函数、类、模块会产生作用域,代码块不会产生作用域。**
代码2:函数作用域
~~~
def f():
i = 1
f()
print(i) # NameError: name 'i' is not defined
~~~
规则
-----
1) **静态作用域规则**
代码3-1:静态作用域
~~~
i = 1
def test():
i += 1
test() # UnboundLocalError: local variable 'i' referenced before assignment
~~~
代码3-2:静态作用域
~~~
i = 1
def test():
print(i)
i += 1
test() # IndentationError: unindent does not match any outer indentation level
~~~
代码4:静态作用域
~~~
i = 1
def g():
print(i)
def f():
i = 2
g()
f() # 1
~~~
2) **最内嵌套作用域规则**
代码5:最内嵌套作用域
~~~
i = 1
def f():
i = 2
def g():
print(i)
return g
func = f() # 无任何输出
func() # 2
print(i) # 1
~~~
分类
-------------------
L:local -- 局部作用域,当前函数
E:enclosing -- 嵌套作用域,外层函数
G:global -- 全局函数,模块
B:built-in -- builtins模块
LEGB
---------
变量查找法则:LEGB
查找顺序:局部 -> 嵌套 -> 全局 -> builtins
global & nonlocal
--------------------
global:局部作用域 中使用/修改 全局变量
nonlocal:局部作用域 中使用/修改 外层(非全局)变量
~~~
# global:
i = 1
def test():
global i
i += 1
test()
print(i) # 2
~~~
~~~
# nonlocal
a = 0
def outer():
b = 0
def inner():
nonlocal b
a = 1
b = 1
inner()
print(b)
outer() # 1
print(a) # 0
~~~
小结
----
变量在python作用域中,最基本的两点:
1) **可读**:内层未申明的变量会自动向外层寻找。
内层作用域可读外层作用域变量。
2) **不可变**:内外层均申明过的变量是相互独立的。
内层作用域可重新申明赋值外层作用域变量,但此时其实是在内层命名空间中重新定义的一个新变量,并不会改变外层作用域变量的值。
- 前言
- Python编程规范
- 编码
- 代码
- 缩进、行宽、引号、空行
- 空格
- 换行
- import
- 注释
- 代码注释
- 文档注释(Docstring)
- 命名规范
- 数据结构
- 变量
- 变量作用域
- 命名空间
- 作用域
- python作用域
- 对象
- 序列
- 可迭代对象
- 迭代器
- 生成器
- 可迭代对象 & 迭代器 & 生成器
- 整数池 & 字符串intern
- 数据类型
- 数字
- int
- float
- NaN
- 四舍五入 & 取整
- 列表
- 元组
- 字典
- 集合
- 字符串
- 字符集&字符编码
- 字符串&字节串
- 字符串函数
- 字符串格式化
- str.format
- Formatted string literals
- format函数
- string.Formatter类
- %
- Format String Syntax
- Format Specification Mini-Language
- fill
- align
- sign
- #
- 0
- width
- grouping_option
- .precision
- type
- locale
- Python3 locale 模块
- 语句
- 运算符
- if/else
- for...in
- while
- break/continue
- 函数
- 函数
- 函数参数
- 递归函数
- 匿名函数
- 高阶函数
- map
- reduce
- filter
- sorted
- 返回函数
- 闭包
- 装饰器
- 函数装饰器
- 带参数的装饰器
- 类装饰器
- 带参数的类装饰器
- 偏函数
- 面向对象
- 类 & 实例
- 属性
- 方法
- 访问限制
- 继承
- 新式类 & 经典类
- MRO
- MixIn
- 模块
- 特殊变量
- 编写模块
- 引入 & 重载
- 搜索模块
- 第三方模块
- 常见模块
- 标准库
- os
- sys
- datetime
- re
- urllib
- time/datetime
- threading
- multiprocessing
- builtins
- help
- range
- enumerate
- 异同
- str() repr() ascii()
- exit()、sys.exit()、os._exit()
- 数据库
- mysql
- 错误、调试、测试
- 异常
- 异常处理
- 自定义异常
- 抛出异常
- 调试
- logging
- pdb
- 线程&&进程
- 线程
- 杂
- python 脚本传参
- python无关
- redis
- mongo
- linux
- mysql简略