目录
感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接
🐒🐒🐒个人主页
🥸🥸🥸C语言
🐿️🐿️🐿️C语言例题
🐣🐓🏀python
变量作用域
观察以下代码
def getPoint():x = 10y = 20return x, yx, y = getPoint()
在这个代码中, 函数内部存在 x, y, 函数外部也有 x, y.
但是这两组 x, y 不是相同的变量, 而只是恰好有一样的名字.
变量只能在所在的函数内部生效
在函数 getPoint() 内部定义的 x, y 只是在函数内部生效. 一旦出了函数的范围, 这两个变量就不再生效了
def getPoint():x = 10y = 20return x, ygetPoint()print(x, y)
在不同的作用域中, 允许存在同名的变量
虽然名字相同, 实际上是不同的变量
x = 20def test():x = 10print(f'函数内部 x = {x}')test()print(f'函数外部 x = {x}')
在函数内部的变量, 也称为 “局部变量”
不在任何函数内部的变量, 也称为 “全局变量”
如果函数内部尝试访问的变量在局部不存在, 就会尝试去全局作用域中查找
x = 20def test():print(f'x = {x}')test()
如果是想在函数内部, 修改全局变量的值, 需要使用 global 关键字声明
x = 20def test():global xx = 10print(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 Falseelse:return Trueresult = 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 = 10print("函数 a")def b():num2 = 20a()print("函数 b")def c():num3 = 30b()print("函数 c")def d():num4 = 40c()print("函数 d")d()
来源地址:https://blog.csdn.net/2301_79178723/article/details/133950933