Python学习笔记函数之局部和全局作用域

随笔记录方便自己和同路人查阅。

#------------------------------------------------我是可耻的分割线-------------------------------------------

  在被调用函数内赋值的変元和变量,处于该函数的“局部作用域”。在所有函数之外赋值的变量,属于“全局作用域”。

处于局部作用域的变量,被称为“局部变量”。处于全局作用域的变量,被称为“全局变量”。一个变量必是其中一种,不能

即是局部又是全局。

  可以将“作用域”看成是变量的容器,当作用域被销毁时,所有保存在该作用域内的变量的值就被丢弃了。只有一个

全局作用域,它是程序开始时创建的。如果程序终止,全局作用域就被销毁,他的所有变量就被丢弃了。否则,下次你

运行程序的时候,这些变量就会记住他们上次运行时的值。

  一个函数被调用时,该函数返回时,这个局部作用域就被销毁了,这些变量就丢失了。下次调用这个函数,局部变量

不会记得该函数上次被调用时它们保存的值。

  作用域很重要,理由如下:

  (1)全局作用域中的代码不能使用任何局部变量

  (2)但是,局部作用域可以访问全局变量

  (3)一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量

  (4)如果在不同作用域中,你可以使用相同的名字命名不同变量。也就是说可以有一个名为spam的局部变量,和一个

名为spam的全局变量

  Python有不同的作用域,而不是让所用东西都成为全局变量,这是有理由的。这样一来,当特定函数调用中的代码修改

变量时,该函数与程序其他部分的交互,只能通过他的参数和返回值。这就缩小了可能导致缺陷的代码作用域。如果程序只

包含全局变量,又有一个变量赋值错误的缺陷,那就很难追踪这个赋值错误发生的位置。它可能在程序的任何地方赋值,而

你的程序可能有几百到几千行!但如果缺陷是因为局部变量做粗赋值,你就会知道,只有那一个函数中的代码可能产生赋值

错误。

  虽然在小程序中使用全局变量没有太大问题,但当程序变得越来越大时,依赖全局变量就是一个坏习惯。

#------------------------------------------------我是可耻的分割线-------------------------------------------

  1、局部变量不能在全局作用域内使用,示例代码:

#
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
#import random
def hell():#定义一个函数
    local = 1+1#定义一个局部变量
hello() print(local)#在全局作用域打印局部变量

  运行结果:

  发生错误是因为,local只属于hello函数创建的局部作用域。在程序执行从hello()函数返回后,该局部作用域就被销毁了,

不在有名为local的变量。所以当程序试图执行print(local)时,Python就报错,说local没有定义。这是有意义的,当程序执行

在全局作用域中时,不存在局部作用域,所以不会有任何局部变量。这就是为什么只有全局变量能用于局部作用域。

  2、局部作用域不能使用其他局部作用域内的变量,示例代码:

#
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
#import random
def hello():#定义一个函数1
    hello_local = 1+1#定义一个局部变量
def world():#定义一个函数2
    world_local = hello_local+1#使用函数1中的局部变量
world()#调用函数

  运行结果:

  3、全局变量可以在局部作用域中读取,示例代码:

#
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
#import random
def hello():#定义一个函数1
    print(name)#打印全局变量
name ="Li Rong Yang"#全局变量
hello()#调用函数

  运行结果:

  4、名称相同的局部变量和全局变量

  局部变量是可以和全局变量同名的,在语法上完全合法。但我们在写代码时应尽量避免局部变量和全局变量同名。

  示例代码:

#
# -*- coding:utf-8 -*-
# Autor: Li Rong Yang
#import random
def spam():
    eggs = 'spam local'
    print(eggs)
def bacon():
    eggs = 'bacon loacl'
    print(eggs)
    spam()
    print('我是spam的 eggs:%s',eggs)
eggs = 'global'
bacon()
print(eggs)

  运行结果:

  从运行结果可以看出,两个函数中的局部变量eggs和全局变量eggs都被打印了。

   

原文地址:https://www.cnblogs.com/lirongyang/p/9532021.html