1、名称空间namespace:存放名字的地方,是对栈区的划分
- 有了命名空间之后,就可以在栈区存放相同的名字
2、作用域(Scope)是指在程序中定义变量或函数时,这些变量或函数可被访问的范围。在不同的作用域中,变量和函数的可见性和访问性是不同的。
3、当访问一个变量时,Python 会按照 LEGB 的顺序进行查找,直到找到第一个匹配的变量,然后停止查找。如果在所有作用域中都找不到变量的定义,就会引发 NameError。
L(Local):局部作用域。包括函数内部定义的变量和参数。在函数内部最先进行变量查找。
E(Enclosing):嵌套函数的父函数的作用域。如果在当前函数内部找不到变量,就会向上一层嵌套的函数中查找。
G(Global):全局作用域。在模块层次定义的变量,对于整个模块都是可见的。
B(Built-in):内置作用域。包括 Python 的内置函数和异常。
python
x = 10 # 全局作用域
# 嵌套模型的内部函数类似于局部作用域,若么有返回值,会在函数执行结束后被释放,在内存中就不存在该值
def outer_func():
x = 20 # 外部函数作用域
def inner_func():
x = 30 # 内部函数作用域
print(x) # 在内部函数中访问变量 x
inner_func()
outer_func()
print(x) # 在全局作用域中访问变量 x
inner_func()# 无法使用,必须需要返回值才可以调用
与函数相关的变量尽量放在函数中,防止全局变量污染
- global关键字用于在函数内部声明一个变量为全局变量,表示在函数内部对该变量的修改将影响到全局作用域中的变量。例如:
python
x = 10
def my_function():
global x
x = 20
print(x)
my_function() # 输出结果为 20
print(x) # 输出结果为 20
在函数my_function内部,使用global关键字声明了变量x为全局变量,然后对其进行了修改。这样,变量x的作用域扩展到了全局范围,所以在函数外部也可以访问到修改后的值。
- nonlocal(一般配合嵌套结构使用)关键字用于在函数内部声明一个变量为非本地变量,表示在函数内部对该变量的修改将影响到上一级的嵌套作用域中的变量。例如:
python
def outer_function():
x = 10
def inner_function():
nonlocal x
x = 20
print(x)
inner_function() # 输出结果为 20
print(x) # 输出结果为 20
outer_function()
在inner_function内部,使用nonlocal关键字声明了变量x为非本地变量,然后对其进行了修改。这样,变量x的作用域扩展到了outer_function的作用域,所以在outer_function内部和外部都可以访问到修改后的值。
面试题:局部变量 和 全局变量的区别?
- 定义位置不同.
- 局部变量: 定义在函数内 或者 函数形参列表中的 变量.
- 全局变量: 定义在函数外的变量, 或者用 global 关键字修饰的变量.
- 在内存中的存储位置不同.
- 局部变量: 存储在 堆区.
- 全局变量: 存储在 方法区.
- 生命周期不同.
- 局部变量: 随着函数的调用而存在, 随着函数的调用完毕而消失.
- 全局变量: 随着 .py文件加载而存在, .py文件从内存中移除而消失.
- 函数返回值------return
使用return语句可以将一个值或对象作为函数的返回值返回。这个返回值可以是任何有效的Python对象,例如数字、字符串、列表、字典等。函数执行到 return 语句时,会立即结束函数的执行,并将指定的返回值传递给调用者。
如果函内没有return,默认返回None,代表没有什么结果返回
下面是一个简单的函数示例,演示了如何使用返回值:
python
# 案例1
def add_numbers(a, b):
s = a + b
return s
result = add_numbers(3, 5)
print(result) # 输出: 8