python函数的作用域

以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢!

原文地址:http://www.runoob.com/python3/python3-function.html

变量作用域python函数的作用域和引用范围

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

x = int(2.9)  # 内建作用域

g_count = 0  # 全局作用域
def outer():
    o_count = 1  # 闭包函数外的函数中
    def inner():
        i_count = 2  # 局部作用域

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这这些语句内定义的变量,外部也可以访问,如下代码:

>>> if True:
...  msg = ‘I am from Runoob‘
...
>>> msg
‘I am from Runoob‘
>>>

实例中 msg 变量定义在 if 语句块中,但外部还是可以访问的。

如果将 msg 定义在函数中,则它就是局部变量,外部不能访问:

>>> def test():
...     msg_inner = ‘I am from Runoob‘
...
>>> msg_inner
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name ‘msg_inner‘ is not defined
>>>

从报错的信息上看,说明了 msg_inner 未定义,无法使用,因为它是局部变量,只有在函数内可以使用。


全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

#!/usr/bin/python3

total = 0; # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2; # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total;

#调用sum函数
sum( 10, 20 );
print ("函数外是全局变量 : ", total)

以上实例输出结果:

函数内是局部变量 :  30
函数外是全局变量 :  0

global 和 nonlocal关键字

当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

以下实例修改全局变量 num:

#!/usr/bin/python3

num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num)
    num = 123
    print(num)
fun1()

以上实例输出结果:

1
123

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

#!/usr/bin/python3

def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

以上实例输出结果:

100
100

另外有一种特殊情况,假设下面这段代码被运行:

#!/usr/bin/python3

a = 10
def test():
    a = a + 1
    print(a)
test()

以上程序执行,报错信息如下:

Traceback (most recent call last):
  File "test.py", line 7, in <module>
    test()
  File "test.py", line 5, in test
    a = a + 1
UnboundLocalError: local variable ‘a‘ referenced before assignment

错误信息为局部作用域引用错误,因为 test 函数中的 a 使用的是局部,未定义,无法修改。

原文地址:https://www.cnblogs.com/cui0x01/p/8487955.html

时间: 2024-07-30 16:22:08

python函数的作用域的相关文章

python函数的作用域和引用范围

以下内容参考自runoob网站,以总结python函数知识点,巩固基础知识,特此鸣谢! 原文地址:http://www.runoob.com/python3/python3-function.html 变量作用域 Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的. 变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称.Python的作用域一共有4种,分别是: L (Local) 局部作用域 E (Enclosing) 闭包函数外的函数中 G (

Python 函数的作用域

python中的作用域有4种: 名称 介绍 L local,局部作用域,函数中定义的变量: E enclosing,嵌套的父级函数的局部作用域,即包含此函数的上级函数的局部作用域,但不是全局的: B globa,全局变量,就是模块级别定义的变量: G built-in,系统固定模块里面的变量,比如int, bytearray等. 搜索变量的优先级顺序依次是(LEGB): 作用域局部 > 外层作用域 > 当前模块中的全局 > python内置作用域. number = 10 # numbe

python 函数的作用域,闭包函数的用法

一.三元表达式 if条件成功的值    if  条件   else else条件成功的值 #if条件成立的结果 if 条件 else else条件成立的结果 # a = 20 # b = 10 # c = 5 if a>b else 10 # print(c) 二.函数的命名空间 命名空间一共分为三种: 全局命名空间 局部命名空间 内置命名空间 *内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...它们都是我们熟悉的,拿过来就可以用的

第七章第4讲:python函数的作用域:局部变量与全局变量

1.局部变量:只在函数体内,函数运行之前或运行结束之后,该变量无效 def calculateTax(price,tax_rate): print(price) taxTotal = price * tax_rate return taxTotal my_price = int(input("Enter a price:")) totalPrice = calculateTax(my_price,8) print("Price = ",my_price,"

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

3.关于python函数,以及作用域,递归等知识点

一.使用函数编程的好处. 大大的提高了代码的重用行,重复的逻辑或者操作,可以定义到一个函数里,多次调用. 下面是关于提高代码重用性的例子. 现在老板让你写一个监控程序,监控服务器的系统状况,当cpu\memory\disk等指标的使用量超过阀值时即发邮件报警,你掏空了所有的知识量,写出了以下代码. while True: if cpu利用率 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 if 硬盘使用空间 > 90%: #发送邮件提醒 连接邮箱服务器 发送邮件 关闭连接 i

【Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数】

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

Python第二周之函数及其作用域

# 函数 定义: 我们可以把程序中相对独立的功能模块抽取出来,这样的好处是可以减少重复代码的编写,将来可以重复使用这些功能模块,Python中的函数就是代表了这样的功能模块. 命名: age_of_student(官方) 或 ageOfStudent(大部分人的习惯用法,又称驼峰命名法) 调用: import 模块 (as 别名) 函数名(参数) 注意:二元运算符之间放空格,参数里赋值时,等号两边不加空格.例如:def f(x=2) #y = x !定义求阶乘这个函数,将求阶乘这个功能抽取出来,

python——函数嵌套和作用域

1.三元运算if条件成立的结果 if 条件 else 条件不成立的结果例如: a=20 b=10 c=a if a>b else b print(c) 2.命名空间 全局命名空间:创建的存储"变量名与值的关系"的空间叫做全局命名空间 局部命名空间:在函数的运行中开辟的临时的空间叫做局部命名空间 内置命名空间:内置命名空间中存放了python解释器为我们提供的名字:input,print,str,list,tuple...等等 三种命名空间之间的加载顺序和取值顺序:加载顺序:内置(