• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

无信不立

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

【python】Python如何在函数中使用同名的全局变量?

《Python局部变量和全局变量》一节中提到,全局变量可以在程序中任何位置被访问甚至修改,但是,当函数中定义了和全局变量同名的局部变量时,那么在当前函数中,无论是访问还是修改该同名变量,操作的都是局部变量,而不再是全局变量。

当函数内部的局部变量和函数外部的全局变量同名时,在函数内部,局部变量会“遮蔽”同名的全局变量。

 

有读者可能并不能完全理解上面这段话,没关系,这里举个实例:

name = "Python教程"
def demo ():
    #访问全局变量
    print(name)
demo()


程序执行结果为:
Python教程



name = "Python教程"
def demo ():
    #访问全局变量
    print(name)
    name = "shell教程"
demo()

执行此程序,Python 解释器报如下错误:
UnboundLocalError: local variable 'name' referenced before assignment
该错误直译过来的意思是:所访问的 name 变量还未定义。这是什么原因呢?就是我们添加第 5 行代码导致的。

Python 语法规定,在函数内部对不存在的变量赋值时,默认就是重新定义新的局部变量。上面程序中,第 5 行就定义了一个新的 name 局部变量,由于该局部变量名和全局变量名 name 同名,局部 name 变量就会“遮蔽”全局 name 变量,再加上局部变量 name 在 print(name) 后才被初始化,违反了“先定义后使用”的原则,因此程序会报错。

 

 

那么,如果就是想在函数中访问甚至修改被“遮蔽”的变量,怎么办呢?可以采取以下 2 中方法:

  1. 直接访问被遮蔽的全局变量。如果希望程序依然能访问 name 全局变量,且在函数中可重新定义 name 局部变量,也就是在函数中可以访问被遮蔽的全局变量,此时可通过 globals() 函数来实现,将上面程序改为如下形式即可:
  2. name = "Python教程"
    def demo ():
        #通过 globals() 函数访问甚至修改全局变量
        print(globals()['name'])
        globals()['name']="Java教程"
        #定义局部变量
        name = "shell教程"
    demo()
    print(name)
    
    
    程序执行结果为:
    Python教程
    Java教程

     

在函数中声明全局变量。为了避免在函数中对全局变量赋值(不是重新定义局部变量),可使用 global 语句来声明全局变量。因此,可将程序改为如下形式:

    1. name = "Python教程"
      def demo ():
          global name
          #访问全局name变量
          print(name)
          #修改全局name变量的值
          name = "shell教程"
      demo()
      print(name)

      程序执行结果为:

      Python教程
      shell教程

      增加了“global name”声明之后,程序会把 name 变量当成全局变量,这意味着 demo() 函数后面对 name 赋值的语句只是对全局变量赋值,而不是重新定义局部变量。

posted on 2024-07-29 19:09  无信不立  阅读(177)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3