Python动态参数、命名空间与函数嵌套机制详解

听雨眠
听雨眠
发布时间:2026-10-13| 3人浏览过
原创

本文详细解析Python中的动态参数传递机制,包括*args位置参数聚合与**kwargs关键字参数字典打包。深入探讨内置、全局及局部命名空间的加载与取值顺序,明确全局与局部作用域的区别。通过函数嵌套示例,阐明global修改全局变量与nonlocal修改外层函数变量的具体行为差异,帮助开发者掌握变量作用域规则。

Python动态参数机制

1. 函数的动态参数

1.1 *args 位置参数动态传参


def chi(*food):
 print("我要吃", food)
chi("大米饭", "小米饭")
结果:我要吃 ('大米饭', '小米饭') # 多个参数传递进去. 收到的内容是元组tuple

1.2 **kwargs 关键字参数动态传参


def func(**kwargs):
 print(kwargs)
func(a=1, b=2, c=3)
func(a=1, b=2)

结果:


{'a': 1, 'b': 2, 'c': 3}
{'a': 1, 'b': 2}

顺序:位置参数, *args, 默认值, **kwarg


 def func(*args, **kwargs):
    pass

形参的位置*,**: 聚合

实参的位置*,**: 打散


def fun(*args):
 print(args)
lst = [1, 4, 7]
fun(lst[0], lst[1], lst[2])
fun(*lst) # 可以使用*把一个列表按顺序打散
s = "小短腿鲁班七号"
fun(*s) # 字符串也可以打散, (可迭代对象)

Python命名空间与加载顺序

2. 命名空间

当Python解释器启动并准备执行代码时,会在内存中开辟一个空间。每当遇到变量定义时,解释器会将变量名与其值的对应关系记录下来。然而,当遇到函数定义语句时,解释器仅将函数名加载到内存中,确认该函数的存在,而不会立即执行函数内部的变量声明或逻辑代码。这意味着函数在定义阶段仅完成加载,只有当函数被调用或访问时,解释器才会根据函数内部声明的变量来开辟内部空间。随着函数执行结束,这些内部变量占用的空间也会随之释放。

2.1 内置名称空间 -- 存放python解释器为我们提供的名字, list, tuple, str, int 等这些都是内置命名空间

2.2 全局名称空间 -- 我们直接在py文件中, 函数外声明的变量都属于全局命名空间

2.3 局部名称空间 -- 在函数中声明的变量会放在局部命名空间

加载顺序:内置命名空间 >>> 全局命名空间 >>> 局部命名空间(函数被执行的时候)

取值顺序: 局部命名空间 >>> 全局命名空间 >>> 内置命名空间

作用域:

作用域: 作用范围即生效范围,按生效范围可分为全局作用域和局部作用域。

全局作用域: 包含内置命名空间和全局命名空间。在整个文件的任何位置都可以使用(遵循从上到下逐行执行).

局部作用域: 在函数内部可以使用.

1. 全局作用域: 内置+全局 2. 局部作用域: 局部(函数被调用) 3. globals() 查看全局中的内容 4. locals() 查看当前作用域中的内容


a = 10
def func():
 a = 40
 b = 20
def abc():
 print("哈哈")
 print(a, b) # 这里使用的是局部作用域
 print(globals()) # 打印全局作用域中的内容
 print(locals()) # 打印局部作用域中的内容
func()

函数嵌套与变量修饰关键字

3. 函数嵌套

函数可以互相的嵌套


def fun1():
 print(111)
def fun2():
 print(222)
 fun1()
fun2()
print(111)

# 函数的嵌套
def fun2():
 print(222)
 def fun3():
  print(666)
 print(444)
 fun3()
 print(888)
print(33)
fun2()
print(555) 

4. global和nonlocal关键

global: 在局部访问全局中的内容


a = 100
def func():
 global a # 加了个global表示不再局部创建这个变量了. 而是直接使用全局的a
 a = 28
 print(a)
func()
print(a)

nonlocal: 在局部寻找外层函数中离他最近的那个变量


a = 10
def func1():
 a = 20
 def func2():
 nonlocal a
 a = 30
 print(a)
 func2()
 print(a)
func1()
# 结果:
# 加了nonlocal
# 30
# 30
# 不加nonlocal
# 30
# 20

总结

以上所述是小编给大家介绍的Python动态参数/命名空间/函数嵌套/global和nonlocal,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对本站网站的支持!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。