函数3:作用域

目录

1. 局部作用域

2. 全局作用域

3. global语句:函数中修改全局变量

4. 嵌套函数

5. nonlocal 语句:内部函数修改外部函数变量

6. LEGB规则


1. 局部作用域

在函数内赋值的变量和变元都,处于'局部作用域',属于局部变量;

定义在函数内部的变量是局部变量,局部变量的作用范围只能在函数内部生效,不能在函数外被引用;

局部变量除了在函数代码块声明的变量意外,还包括函数的形参。

#示例代码如下
def funx(price,rate):
    final = price * rate
    return final

input_price = float(input("输入价格:"))
input_rate = float(input("输入折扣:"))

newprice = funx(input_price,input_rate)

print(f'最终价格为:{newprice}')
print(f'直接去函数结果,最终价格为:{final}')

#不使用局部变量部分执行成功
输入价格:>? 85
输入折扣:>? 0.9
最终价格为:76.5
#直接调用局部变量,报错变量未定义
Traceback (most recent call last):
  File "", line 1, in 
  File "D:\PyCharm\plugins\python\helpers\pydev\_pydev_bundle\pydev_umd.py", line 197, in runfile
    pydev_imports.execfile(filename, global_vars, local_vars)  # execute the script
  File "D:\PyCharm\plugins\python\helpers\pydev\_pydev_imps\_pydev_execfile.py", line 18, in execfile
    exec(compile(contents+"\n", file, 'exec'), glob, loc)
  File "D:/PycharmProject/python代码/044test.py", line 11, in 
    print(f'直接去函数结果,最终价格为:{final}')
NameError: name 'final' is not defined

2. 全局作用域

在函数外赋值的变量,处于全局作用域,属于全局变量;一个变量肯定是局部/全局变量其中一种,不可能既是属于全局作用域又是属于局部作用域;

全局变量拥有更大的作用域,在函数中可以访问全局变量;

#函数中直接访问全局变量
input_price = float(input("输入价格:"))
input_rate = float(input("输入折扣:"))

def funx():
    final = input_price * input_rate
    return final

newprice = funx()
print(f'最终价格为:{newprice}')

#成功执行,并返回正确结果
输入价格:>? 80
输入折扣:>? 0.7
最终价格为:56.0

如果在函数中修改全局变量值,那么Python实际生成一个新的同名但不同id的局部变量,函数中使用新生成的局部变量赋值;

跳出函数后,同名局部变量失效,全局变量值不改变。

#测试代码如下:
input_price = float(input("输入价格:"))
input_rate = float(input("输入折扣:"))
print(f'input_price全局变量id为:{id(input_price)}')
print(f'input_rate全局变量id为:{id(input_rate)}')

def funx():
    input_price = 50
    input_rate =0.5
    final = input_price * input_rate
    print(f'函数中,input_price值为:{input_price},input_rate值为:{input_rate}')
    print(f'input_price函数内局部变量id为:{id(input_price)}')
    print(f'input_rate函数内局部变量id为:{id(input_rate)}')
    return final

newprice = funx()
print(f'最终价格为:{newprice}')
print(f'函数结束时,input_price值为:{input_price},input_rate值为:{input_rate}')
print(f'函数结束时,input_pri

你可能感兴趣的:(Python学习,#,函数,python,开发语言)