目录
函数
- 函数基本概念
- 函数四大参数
变量作用域
- 全局变量
- 局部变量
- global关键字
二、变量作用域
本质:变量的作用范围
(1)例题
c = 50 #这个c定义在在函数外部
def add(x,y):
c = x + y #这个c定义在函数内部,所以其影响范围仅在函数内部 #只是名字相同,依然是两个不同的变量
print(c)
add(1,2)
print(c)
-->
3
50
上面的本质,和下面是一样的
c = 50
def add(x,y):
a = x + y #本质是这样的,与c没关系。
print(a)
add(1,2)
print(c)
-->
3
50
(2)函数内部定义的变量,能在函数外部调用使用吗?
不能
def demo():
c = 10 #c的作用域仅仅局限于函数内部
print(c) #c的调用已经超出了c的作用域
-->
error ❌ c未定义
1.全局变量、局部变量
c = 10 #全局变量
def demo():
print(c)
demo() #全局变量覆盖整个模块
-->
10
c = 10
def demo():
c = 50 #局部变量,作用范围是函数内部
print(c)
demo()
-->
50
2.局部变量的相对性
def demo():
c = 50 #相对于函数外部,c是局部变量。函数外部无法调用
print(c)
-->
error ❌ c未定义
def demo():
c = 50 #相对于for循环内部,这个c就不是局部变量了。而是是平级的关系
for i in range(0,9):
c += 1 #这个c和上面的c = 50是平级的变量关系
print(c)
demo()
-->
59
- for循环内部定义的变量,能在循环外部调用使用吗?
能
def demo(): #只有函数才能形成作用域
c = 50
for i in range(0,9): #⭐for循环是形不成作用域的。循环内外的变量是平级的
a = 'a'
c += 1
print(c)
print(a) # 所以,for循环外部,是可以引用for循环内部的变量的
demo()
-->
59
a #所以,能打印出a
小结:
全局变量:是模块级别的,可以被多个函数引用
局部变量:函数里面定义的,只能函数里面用
当然,不只for循环,if else等控制语句,都不能形成作用域。
比较其他语言,比如java、C#中,控制语句可以形成作用域。
python去掉了代码块作用域的概念,所以简洁很多
3.作用域链
看起来很高深,换个解读方法就很easy:
针对局部变量,其作用域具有链式的特征。就是说,会逐级的引用和寻找
c = 1
def func1():
c = 2
def func2(): #函数里面再定义一个函数
c = 3
print(c) #优先使用最近的局部变量:c = 3
func2() #跳出func2这个函数,在func1函数的内部末尾,调用一下func2
func1() #然后,跳出func1函数,在模块里面再调用下func1
-->
3
c = 1
def func1():
c = 2
def func2():
print(c) #优先使用最近的变量:c = 2
func2()
func1()
-->
3
c = 1
def func1():
def func2():
print(c) #优先使用最近的变量:c = 1
func2()
func1()
-->
3
注意
作用域链的前提,是必须具有作用域。像for in循环等控制语句,是没有作用域的。所以,压根儿不会出现变量的逐级引用和寻找。
4.全局变量仅限一个模块吗?
不是。
全局变量如果不做特别限制,那么在整个应用程序里,你都可以引用,不是只能在某一个模块里。
5.global关键字
例题:
(1)如果已在函数内部定义了局部变量,又想在函数外部访问这个内部的局部变量。怎么办?
def demo():
c = 2
demo()
print(c) #一般情况下,函数外部是不能调用函数内部的局部变量的
-->
error ❌ c未定义
def demo():
global c #先定义一个global的变量c,强制将局部变量变为全局变量
c = 2
demo() #必须得有,只有先调用了demo,上面定义的demo内部代码才能运行。否则,你打印不出来
print(c)
-->
2
(2)其他模块可以引用这个global c
吗?
可以。
c13.py
def demo():
global c # global关键字
c = 2
demo()
print(c) #第一次打印
c14.py
import c13
print(13.c) #第二次打印,输出c13.py模块中的变量c
-->
2
2
Comments | NOTHING