Python之函数-局部变量和global

Python之函数-局部变量和global

global语句

  • 使用global关键字的变量,将foo内的x声明为使用外部的全局作用域中定义的x
  • 全局作用域中必须有x的定义

global使用原则

  • 外部作用域变量会在内部作用域可见,但也不要在这个内部的局部作用域中直接使用,因为函数的 目的就是为了封装,尽量与外界隔离
  • 如果函数需要使用外部全局变量,请尽量使用函数的形参定义,并在调用传实参解决
  • 一句话:不用global。学习它就是为了深入理解变量作用域

作用域:标识符的可见范围

  • 函数开辟了一个作用域,x被限制在当前函数作用域中,对外不可见
  • 全局的,函数外的变量,对内穿透
  • 本地使用标识符,优先使用当前作用域
  • 优先使用本地定义的局部变量,优先原则
  • 全局变量,如果所有函数都是用全局变量,局部作用域就没有用了。全局变量污染
  • 全局变量一般来说都是公用的,一般情况不要修改
  • 全局变量也是有作用域的,只不过是全局的,所以全局可见
  • 不要用global
  • 函数形参,调用时送入实参
z = 100
def fn1():
    print(z)

# 定义一个函数fn1
fn1()

# 执行fn1函数
# 返回结果:100
del(z)

# 删除z变量
z

# 执行z变量
# 报错内容:NameError: name 'z' is not defined
z = 100
def fn2():
    print(z)
    t = z + 1
    print(t)
fn2()

# 执行fn2
# 返回结果:100
# 返回结果:101
del(z)

# 删除z变量
z = 100
def fn3():
    print(z)
    m = z + 1
    print(m)
    z = z + 1
    print(z)

# 定义变量fn3
fn3()

# 执行fn3
# 报错内容:UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
del(z)

# 删除z变量
z = 123
def fn4():
    print(z) # z
    z += 1  
    print(z)

# z的赋值语句 z = z+1,如果函数中出现 z=xxx赋值语句,z就是当前函数的局部变量
fn4()

# 报错内容:UnboundLocalError: cannot access local variable 'z' where it is not associated with a value
z = 111
def fn6():
    z = 3000
    print(z)
    y = z + 1
    print(y)

# 定义函数fn6
fn6()

# 执行fn6
# 返回结果:3000
# 返回结果:3001
z = 3333
def fn7():
    global z # 声明z不再是局部的,而是全局变量
    print(z)
    z += 1
    print(z)

# global 声明z不再是局部的,而是全局变量
z

# 返回结果:3333
fn7()

# 返回结果:3333
# 返回结果:3334
z = 3333
def fn7():
    global z 
    print(z)
    z += 1
    print(z)
    
def fn8():
    global z
    z += 100
    print(z)

# 如果多个函数都调用全局变量,都要修改,就带来了全局变量污染的问题,尽量不要使用全局变量
fn7()

# 返回结果:3333
# 返回结果:3334
fn8()

# 返回结果:3434
z = 4444
def fn10(x): # 形参一定是局部变量
    x += 1
    print(x)

# 形参一定是局部变量
fn10(z)

# 函数调用了z,函数内x += 1 是4445,并不会改变变量z
# 返回结果:4445
z

# z的值不会被修改
# 返回结果:4444

你可能感兴趣的:(Python,python,开发语言)