You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
PyLzuCSEdu/3 变量作用域.ipynb

209 lines
5.0 KiB

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## 变量的作用域\n",
"\n",
"变量的作用域scope决定了变量可以被访问和使用的代码区域。\n",
"\n",
"在Python中变量的作用域主要有以下几种类型\n",
" - 局部作用域 (Local Scope):函数内部定义的变量, 仅在函数内部可见可用。\n",
" - 嵌套作用域 (Enclosing Scope):在嵌套函数中,外部函数的变量对内部函数可见。\n",
" - 全局作用域 (Global Scope): 在所有函数外部定义的变量,可以在整个程序中被访问。\n",
" - 内置作用域 (Built-in Scope): 包含Python内置函数、变量和异常等。最外层作用域。 "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 局部变量和全局变量\n",
" - 赋值运算默认创建局部变量"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n",
"10\n"
]
}
],
"source": [
"x = 10 # 全局变量\n",
"\n",
"def ff():\n",
" y = 5 # 赋值运算默认创建局部变量\n",
" print(x) # 可以访问全局变量 x\n",
"\n",
"ff() # 调用函数输出10\n",
"print(x) # 输出全局变量x的值仍然是10\n",
"# print(y) # 出错y 在 ff 内部定义,是局部变量,在函数外部无法访问"
]
},
{
"cell_type": "raw",
"metadata": {},
"source": [
"''' 特别注意:下面代码发生错误。\n",
"因为执行到 x = x + 2 ,首先将 x 登记为局部变量,\n",
"接着计算右边的x + 2时x还未被定义所以会报错。\n",
"'''\n",
"x = 10\n",
"\n",
"def ff(): \n",
" x = x + 2 # x += 2 等价\n",
" \n",
"ff()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 函数嵌套\n",
"\n",
"Python 变量访问优先级规则(LEGB)这也是变量的遮蔽顺序Local局部作用域 -> Enclosing嵌套作用域 -> Global全局作用域 -> Built-in内置作用域\n"
]
},
{
"cell_type": "code",
"execution_count": 25,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"2\n",
"5\n",
"10\n"
]
}
],
"source": [
"x = 10 # 全局变量\n",
"\n",
"def outer():\n",
" x = 5 # outer函数的局部变量\n",
"\n",
" def inner():\n",
" x = 2 # inner函数的局部变量\n",
" print(x) # 输出局部变量x的值\n",
"\n",
" inner() # 输出2\n",
" print(x) # 输出outer函数的局部变量x的值即 5\n",
"\n",
"outer() # 调用outer函数\n",
"print(x) # 输出全局变量x的值即10"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### 如果打算给非局部变量赋值,需要特别申明"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### global 关键字功能\n",
"\n",
"想在函数内部修改全局变量使用global关键字。"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"5\n"
]
}
],
"source": [
"x = 10 # 全局变量\n",
"\n",
"def func():\n",
" global x # 声明使用全局变量 x\n",
" x = 5 # 修改全局变量 x 的值\n",
"\n",
"func() # 调用函数修改全局变量x的值\n",
"print(x) # 输出全局变量x的新值现在是 5"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### nonlocal 关键字功能\n",
"\n",
"函数嵌套时如果想修改外层函数的局部变量需要使用nonlocal关键字。"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10\n"
]
}
],
"source": [
"def outer():\n",
" x = 5 # outer函数的局部变量\n",
"\n",
" def inner():\n",
" nonlocal x # 声明x是outer函数的局部变量而不是全局变量\n",
" x = 10 # 修改outer函数的局部变量x的值\n",
"\n",
" inner() # 调用inner函数\n",
" print(x) # 输出修改后的x值即10\n",
"\n",
"outer() # 调用outer函数"
]
}
],
"metadata": {
"hide_input": false,
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.3"
}
},
"nbformat": 4,
"nbformat_minor": 4
}