感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒个人主页
🥸🥸🥸C语言
🐿️🐿️🐿️C语言例题
🐣🐓🏀python
变量作用域
观察以下代码
def getPoint(): x = 10 y = 20 return x, y x, y = getPoint()
在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y.
但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字.
变量只能在所在的函数内部生效
在函数 getPoint() 内部定义的 x, y 只是在函数内部生效. 一旦出了函数的范围, 这两个变量就不再生效了
def getPoint(): x = 10 y = 20 return x, y getPoint() print(x, y)
在不同的作用域中, 允许存在同名的变量
虽然名字相同, 实际上是不同的变量
x = 20 def test(): x = 10 print(f'函数内部 x = {x}') test() print(f'函数外部 x = {x}')
在函数内部的变量, 也称为 “局部变量”
不在任何函数内部的变量, 也称为 “全局变量”
如果函数内部尝试访问的变量在局部不存在, 就会尝试去全局作用域中查找
x = 20 def test(): print(f'x = {x}') test()
如果是想在函数内部, 修改全局变量的值, 需要使用 global 关键字声明
x = 20 def test(): global x x = 10 print(f'函数内部 x = {x}') test() print(f'函数外部 x = {x}')
如果此处没有 global , 则函数内部的 x = 10 就会被视为是创建一个局部变量 x, 这样就和全局变量 x 不相关了
if / while / for 等语句块不会影响到变量作用域
换而言之, 在 if / while / for 中定义的变量, 在语句外面也可以正常使用.
for i in range(1, 10): print(f'函数内部 i = {i}') print(f'函数外部 i = {i}')
函数执行过程
调用函数才会执行函数体代码. 不调用则不会执行.
函数体执行结束(或者遇到 return 语句), 则回到函数调用位置, 继续往下执行.
def test(): print("执行函数内部代码") print("执行函数内部代码") print("执行函数内部代码") print("1111") test() print("2222") test() print("3333")
这个过程还可以使用 调试器来观察.
链式调用
前面的代码很多都是写作
# 判定是否是奇数 def isOdd(num): if num % 2 == 0: return False else: return True result = isOdd(10) print(result)
实际上也可以简化写作
print(isOdd(10))
把一个函数的返回值, 作为另一个函数的参数, 这种操作称为 链式调用
嵌套调用
函数内部还可以调用其他的函数, 这个动作称为 "嵌套调用
def test(): print("执行函数内部代码") print("执行函数内部代码") print("执行函数内部代码")
test 函数内部调用了 print 函数, 这里就属于嵌套调用
一个函数里面可以嵌套调用任意多个函数
函数嵌套的过程是非常灵活的
def a(): print("函数 a") def b(): print("函数 b") a() def c(): print("函数 c") b() def d(): print("函数 d") c() d()
如果把代码稍微调整, 打印结果则可能发生很大变化.
def a(): print("函数 a") def b(): a() print("函数 b") def c(): b() print("函数 c") def d(): c() print("函数 d") d()
注意体会上述代码的执行顺序. 可以通过画图的方式来理解.
函数之间的调用关系, 在 Python 中会使用一个特定的数据结构来表示, 称为 函数调用栈 . 每次函数调用,都会在调用栈里新增一个元素, 称为 栈帧.
每个函数的局部变量, 都包含在自己的栈帧中
def a(): num1 = 10 print("函数 a") def b(): num2 = 20 a() print("函数 b") def c(): num3 = 30 b() print("函数 c") def d(): num4 = 40 c() print("函数 d") d()