python中全局变量和局部变量详解

python中全局变量和局部变量详解写在最前面 python 中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问 而全局变量可以直接访问 我们先来看一个最简单的例子 事实上这并不是一个真正的全局变量 只是在类中的一个变量 我们先从类中的变量访问开始讲起那么我们要如何访问这个变量呢 classvariabl a 我是类变量 defshowvarib

写在最前面:

python中全局变量和局部变量的最大区别在于局部变量只能通过函数去访问,而全局变量可以直接访问。

!!!

我们先来看一个最简单的例子,事实上这并不是一个真正的全局变量,只是在类中的一个变量。

!!!

我们先从类中的变量访问开始讲起

那么我们要如何访问这个变量呢?

class variable: a = '我是类变量' def showvarible(self): b = '我是函数变量' print(a) print(b) variable().showvarible()

毫无疑问,编译器就已经报错了,这是因为类中的变量不可以在函数中直接访问,应该这样

class variable: a = '我是类变量' def showvarible(self): b = '我是函数变量' print(variable.a) print(b) variable().showvarible()
我是类变量 我是函数变量 

其实我们还可以通过self去访问

class variable: a = '我是类变量' def showvarible(self): b = '我是函数变量' print(self.a) print(b) variable().showvarible()

 结果是一样的

我是类变量 我是函数变量

 

还可以怎么做呢,我们通过构造函数给定一个参数,类中可访问

class variable: def __init__(self,a): self.a = '我是类变量' def showvarible(self): b = '我是函数变量' print(self.a) print(b) variable(1).showvarible()
我是类变量 我是函数变量

 这里需要注意的是,实例化的时候必须给参数,由于python是动态语言,不需要指定参数的类型,你可以放int,比如1,也可以给一个字符串。 

 

然后我们真正看一下全局变量

a = '我是真正的全局变量' def showvariable(): b = '我一直都是局部变量' print(a) print(b) showvariable()
我是真正的全局变量 我一直都是局部变量 

 

当我们试图在函数外访问这个函数的局部变量时

a = '我是真正的全局变量' def showvariable(): b = '我一直都是局部变量' print(a) def showb(): print(b) showvariable()

报错

我是真正的全局变量 Traceback (most recent call last): File "F:/leetcode/xxx.py", line 13, in 
  
    showb() File "F:/leetcode/xxx.py", line 9, in showb print(b) NameError: name 'b' is not defined 
  

说明局部变量只能在局部使用。

那么不巧的是,我的局部变量和全局变量定义了同一个名称,谁的优先级更高呢?

a = '我是真正的全局变量' def showvariable(): a = '我一直都是局部变量' print(a) print(a) showvariable()

我猜是局部变量,嘿嘿

我是真正的全局变量 我一直都是局部变量

果然,函数优先使用了局部变量

而优先级还有一个体现,来看下面的例子

a = 3 def showvariable(): a = a * 5 print(a) showvariable()

你可能会认为输出15,但是上面的一个例子告诉我们,在函数内会优先使用局部变量

3 Traceback (most recent call last): File "F:/leetcode/xxx.py", line 10, in 
  
    showvariable() File "F:/leetcode/xxx.py", line 5, in showvariable a = a * 3 UnboundLocalError: local variable 'a' referenced before assignment 
  

这样是因为,我们在函数内定义了一个局部变量a,但是还没来得及赋值,就被*5,编译器不知道拿谁去*5,当然报错了。

 

下面讲讲global,global第一次是只能定义不能赋值的

def showvariable(): global a a = '我是global' print(a) showvariable()
我是global

当然是可以在函数外访问的

def showvariable(): global a a = '我是global' print(a) def showglobal(): print(a) showvariable() showglobal()
我是global 我是global

但是,必须赋值后才有意义,如果像这样

def showvariable(): global a a = '我是global' print(a) def showglobal(): print(a) print(a) showvariable() showglobal()

在没有赋值的时候,就去打印

Traceback (most recent call last): File "F:/leetcode/xxx.py", line 9, in 
  
    print(a) NameError: name 'a' is not defined 
  

因为此时global a还没有赋值,当然不能打印。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215096.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:42
下一篇 2026年3月18日 下午2:43


相关推荐

  • Genspark 推出超级智能体:能自主规划、代打电话和思考

    Genspark 推出超级智能体:能自主规划、代打电话和思考

    2026年3月15日
    2
  • docker下载安装教程_docker安装macos

    docker下载安装教程_docker安装macos前言Docker提供轻量的虚拟化,你能够从Docker获得一个额外抽象层,你能够在单台机器上运行多个Docker微容器,而每个微容器里都有一个微服务或独立应用,例如你可以将Tomcat运行在一个D

    2022年7月31日
    7
  • pymssql 中文乱码_pycharm输出中文乱码

    pymssql 中文乱码_pycharm输出中文乱码开门见山,先放解决问题的代码SELECTCONVERT(NVARCHAR,test_field)AStest_fieldFROMtest_tableWHEREtest_condition=’测试中文’–直接将中文字段test_field(VARCHAR)转化为NVARCHAR,其他类型同理,转换成N开头的类型接下来才是其他可能可行的解决方案:使用其他库,如pyodbc(详细信息请阅读相关文档),可参考:https://blog.csdn.net/zhaogeno1/art

    2025年6月30日
    9
  • 飞机订票系统源代码

    飞机订票系统源代码问题及代码:/****************************************************  *版权所有(C)2017,张思琦 *文件名称:飞机订票系统  *文件标识:无  *内容摘要:实现录入航班信息、订票、退票、预约、 *          查询航班、查询订单、查看预约、修改航班功能。 *其他内容:无  *当前版本:VC++6.0  *作    者:

    2022年6月16日
    30
  • 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

    进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」一、实验目的和要求1.了解进程调度算法的特点2.掌握进程调度算法,如先来先服务调度算法(firstcomefirstserved,FCFS)、短作业优先调度算法(shotjobfirst,SJF)、时间片轮转调度算法。二、实验内容设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序1.FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行…

    2026年4月18日
    4
  • rabbitmq实际使用案例_沉默的螺旋案例

    rabbitmq实际使用案例_沉默的螺旋案例一.简单模式(队列–>交换机)yml配置:server:port:8088spring:rabbitmq:host:127.0.0.1port:5672username:guestpassword:guestpublisher-confirm-type:correlated#消息确认方式,通过correlated来确认(将来的消息中才会带correlation_id,只有通过correlation_

    2022年10月3日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号