05 函数与变量作用域之三


目录

  • 函数

    • 函数基本概念
    • 函数四大参数
  • 变量作用域

    • 全局变量
    • 局部变量
    • 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

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 05 函数与变量作用域之三


Follow excellence, and success will chase you.