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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

{
"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
}