11_python基础—函数(引用、全局、局部变量)

简介: 11_python基础—函数(引用、全局、局部变量)

一、 变量的引用


变量 和 数据 都是保存在 内存 中的

在 Python 中 函数 的 参数传递 以及 返回值 都是靠 引用 传递的


1.1 引用的概念


在 Python 中


变量 和 数据 是分开存储的

数据 保存在内存中的一个位置

变量 中保存着数据在内存中的地址

变量 中 记录数据的地址,就叫做 引用

使用 id() 函数可以查看变量中保存数据所在的 内存地址


注意:如果变量已经被定义,当给一个变量赋值的时候,本质上是 修改了数据的引用


变量 不再 对之前的数据引用

变量 改为 对新赋值的数据引用


1.2 变量引用 的示例


在 Python 中,变量的名字类似于 便签纸 贴在 数据 上


定义一个整数变量 a,并且赋值为 1



代码 图示
a = 1



  • 将变量 a 赋值为 2


代码 图示
a = 2



变量 b 是第 2 个贴在数字 2 上的标签


1.3 函数的参数和返回值的传递


Python 中,函数的 实参/返回值 都是是靠 引用 来传递来的


def test(num):
    print("在函数内部 %d 对应的内存地址是 %d" % (num, id(num)))
    # 1> 定义一个字符串变量
    result = "hello"
    print("函数要返回数据的内存地址是 %d" % id(result))
    # 2> 将字符串变量返回,返回的是数据的引用,而不是数据本身
    return result
# 1. 定义一个数字的变量
a = 10
# 数据的地址本质上就是一个数字
print("a 变量保存数据的内存地址是 %d" % id(a))
# 2. 调用 test 函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据!
# 注意:如果函数有返回值,但是没有定义变量接收
# 程序不会报错,但是无法获得返回结果
r = test(a)
print("%s 的内存地址是 %d" % (r, id(r)))


47271eb7d41342bf89b6e09da35516b3.png


二、局部变量和全局变量


局部变量 是在 函数内部 定义的变量,只能在函数内部使用


全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量


提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!


2.1 局部变量


局部变量 是在 函数内部 定义的变量,只能在函数内部使用

函数执行结束后,函数内部的局部变量,会被系统回收

不同的函数,可以定义相同的名字的局部变量,但是 彼此之间 不会产生影响


2.1.1 局部变量的作用


在函数内部使用,临时 保存 函数内部需要使用的数据


def demo1():
    num = 10
    print(num)
    num = 20
    print("修改后 %d" % num)
def demo2():
    num = 100
    print(num)
demo1()
demo2()
print("over")


2.1.2 局部变量的生命周期


所谓 生命周期 就是变量从 被创建 到 被系统回收 的过程

局部变量 在 函数执行时 才会被创建

函数执行结束后 局部变量 被系统回收

局部变量在生命周期 内,可以用来存储 函数内部临时使用到的数据


2.2 全局变量


全局变量 是在 函数外部定义 的变量,所有函数内部都可以使用这个变量


# 定义一个全局变量
num = 10
def demo1():
    print(num)
def demo2():
    print(num)
demo1()
demo2()
print("over")


注意:函数执行时,需要处理变量时 会:


首先 查找 函数内部 是否存在 指定名称 的局部变量,如果有,直接使用


如果没有,查找 函数外部 是否存在 指定名称 的全局变量,如果有,直接使用


如果还没有,程序报错!


1) 函数不能直接修改 全局变量的引用


全局变量 是在 函数外部定义 的变量(没有定义在某一个函数内),所有函数 内部 都可以使用这个变量


提示:在其他的开发语言中,大多 不推荐使用全局变量 —— 可变范围太大,导致程序不好维护!


在函数内部,可以 通过全局变量的引用获取对应的数据


但是,不允许直接修改全局变量的引用 —— 使用赋值语句修改全局变量的值


num = 10
def demo1():
    print("demo1" + "-" * 50)
    # 如果使用赋值语句,在函数内部,只是定义了一个局部变量,不会修改到全局变量,只是变量名相同而已
    num = 100
    print(num)
def demo2():
    print("demo2" + "-" * 50)
    print(num)
demo1()
demo2()
print("over")


注意:只是在函数内部定义了一个局部变量而已,只是变量名相同 —— 在函数内部不能直接修改全局变量的值


2) 在函数内部修改全局变量的值(global关键字声明)


  • 如果在函数中需要修改全局变量,需要使用 global 进行声明
# 全局变量
num = 10
def demo1():
    # 希望修改全局变量的值 - 使用 global 声明一下变量即可
    # global 关键字会告诉解释器后面的变量是一个全局变量
    # 再使用赋值语句时,就不会创建局部变量
    global num
    num = 99
    print("demo1 ==> %d" % num)
def demo2():
    print("demo2 ==> %d" % num)
demo1()
demo2()


3) 全局变量定义的位置


  • 为了保证所有的函数都能够正确使用到全局变量,应该 将全局变量定义在其他函数的上方
# 注意:在开发时,应该把模块中的所有全局变量
# 定义在所有函数上方,就可以保证所有的函数
# 都能够正常的访问到每一个全局变量了
a = 10
def demo():
    print("%d" % a)
    print("%d" % b)
    print("%d" % c)
b = 20
demo()
c = 30


注意


  • 由于全局变量 c,是在调用函数之后,才定义的,在执行函数时,变量还没有定义,所以程序会报错!


代码结构示意图如下


cb94f3b527ca4c98becd25323f65573a.png

4) 全局变量命名的建议


  • 为了避免局部变量和全局变量出现混淆,在定义全局变量时,有些公司会有一些开发要求,例如:


  • 全局变量名前应该增加 g_ 或者 gl_ 的前缀


提示:具体的要求格式,各公司要求可能会有些差异

目录
相关文章
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
140 67
|
2天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
14 2
|
29天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
49 18
|
21天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
46 8
|
30天前
|
Python
Python中的函数
Python中的函数
44 8
|
2月前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
2月前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
54 5
|
2月前
|
测试技术 数据安全/隐私保护 Python
探索Python中的装饰器:简化和增强你的函数
【10月更文挑战第24天】在Python编程的海洋中,装饰器是那把可以令你的代码更简洁、更强大的魔法棒。它们不仅能够扩展函数的功能,还能保持代码的整洁性。本文将带你深入了解装饰器的概念、实现方式以及如何通过它们来提升你的代码质量。让我们一起揭开装饰器的神秘面纱,学习如何用它们来打造更加优雅和高效的代码。
|
2月前
|
弹性计算 安全 数据处理
Python高手秘籍:列表推导式与Lambda函数的高效应用
列表推导式和Lambda函数是Python中强大的工具。列表推导式允许在一行代码中生成新列表,而Lambda函数则是用于简单操作的匿名函数。通过示例展示了如何使用这些工具进行数据处理和功能实现,包括生成偶数平方、展平二维列表、按长度排序单词等。这些工具在Python编程中具有高度的灵活性和实用性。
43 2
|
2月前
|
中间件 Docker Python
【Azure Function】FTP上传了Python Function文件后,无法在门户页面加载函数的问题
通过FTP上传Python Function至Azure云后,出现函数列表无法加载的问题。经排查,发现是由于`requirements.txt`中的依赖包未被正确安装。解决方法为:在本地安装依赖包到`.python_packages/lib/site-packages`目录,再将该目录内容上传至云上的`wwwroot`目录,并重启应用。最终成功加载函数列表。