Python中全局变量和局部变量的理解与区别

前言

学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念

但是与其他编程语言又有所不同

全局变量与局部变量两者的本质区别就是在于作用域

用通俗的话来理解的话,

全局变量是在整个py文件中声明,全局范围内都可以访问

局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了

如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的。因此不建议这样使用,这样会使得程序很不健全

直接来看几个例子来理解全局变量和局部变量的区别吧:

Demo1:

def fun(x):
 y=2
 print("乘法的运行结果:",x*y)
num1=1
print("初始num1=",num1)
fun(num1)
print("y的值是:",y)

运行结果:

报错的原因是因为试图访问局部变量,但是访问的地方不在该变量y的作用域中

Demo2:

def fun():
 num1=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

可以看到在函数内部对全局变量的修改后,在函数执行完毕,修改的结果是无效的,全局变量并不会受到影响

再看:

Demo3:

def fun():
 num1*=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

报错了。这是因为在fun()函数使用了局部变量num1,它只是个跟全局变量同名的局部变量,使用前还是要赋值,因此再次强调不要这样使用

global关键字

如果真的想要在函数体内修改全局变量的值,就要使用global关键字

Demo4:

def fun():
 global num1
 num1=2
 print("函数内修改后num1=",num1)
num1=1
print("初始num1=",num1)
fun()
print("运行完函数后num1=",num1)

运行结果:

使用global关键字就是告诉python编译器这个变量不是局部变量而是全局变量,其实有点像是"引用"的意思

nonlocal关键字

再看看另一个跟变量相关的关键字nonlocal,字面意思就是指当前的这个变量不是局部变量。nonlocal是Python3.0中新增的关键字,python2.x不支持

先来看看下面这段代码

def fun():
 num2=3
 def fun2():
 num2*=2
 print("num2=",num2)
 return fun2()

fun()

运行结果:

错误的原因跟前面的差不多,就是使用了未定义的局部变量,然而num2也不是全局变量,只是fun2函数的外层变量,强行使用global定义num2的话同样会报错(不信你试试)

这时候需要使用nonlocal关键字:

def fun():
 num2=3
 def fun2():
 nonlocal num2
 num2*=2
 print("num2=",num2)
 return fun2()

fun()

运行结果:

如此,程序就能正常执行

总结

到此这篇关于Python中全局变量和局部变量的文章就介绍到这了,更多相关Python全局变量和局部变量内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python 专题六 局部变量、全局变量global、导入模块变量

    定义在函数内的变量有局部作用域,在一个模块中最高级别的变量有全局作用域.本文主要讲述全局变量.局部变量和导入模块变量的方法. 参考:<Python核心编程 (第二版)> 一. 局部变量 声明适用的程序的范围被称为了声明的作用域.在一个过程中,如果名字在过程的声明之内,它的出现即为过程的局部变量:否则出现即为非局部.例: def foo(x): print 'x = ',x x = 200 print 'Changed in foo(), x = ',x x = 100 foo(x) print

  • Python局部变量与全局变量区别原理解析

    1.局部变量 name = "Yang Li" def change_name(name): print("before change:",name) name = "你好" print("after change", name) change_name(name) print("在外面看看name改了么?",name) 输出: before change: Yang Li after change 你好

  • 解析python的局部变量和全局变量

    局部变量 什么是局部变量 通俗定义:函数内部定义的变量就叫局部变量. 话不多说,代码如下: def test1(): a = 300 # 定义一个局部变量a,并初始化300 print("--test1--修改前:a=%s" % a) a = 200 # 给变量a重新赋值200 print("--test1--修改后:a=%s" % a) def test2(): a = 400 # 定义另一个局部变量a,并初始化400 print("--test2--修

  • 从局部变量和全局变量开始全面解析Python中变量的作用域

    理解全局变量和局部变量 1.定义的函数内部的变量名如果是第一次出现, 且在=符号前,那么就可以认为是被定义为局部变量.在这种情况下,不论全局变量中是否用到该变量名,函数中使用的都是局部变量.例如: num = 100 def func(): num = 123 print num func() 输出结果是123.说明函数中定义的变量名num是一个局部变量,覆盖全局变量.再例如: num = 100 def func(): num += 100 print num func() 输出结果是:Unb

  • Python全局变量与局部变量区别及用法分析

    本文实例讲述了Python全局变量与局部变量区别及用法.分享给大家供大家参考,具体如下: 对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白两者的区别了. 定义: 全局变量:在模块内.在所有函数的外面.在class外面 局部变量:在函数内.在class的方法内 下面来看看例子 一.函数内部调用全局变量 a="hello" #全局变量a def test(): global a#调用全局变量a b =a #test方法里之后再调用a时,都是全局的a prin

  • 图解python全局变量与局部变量相关知识

    这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解一下作用域 a = 10 def func(): b = 20 def inner(): c = 30 以上面这个程序为例:打印a,b,c 可以看到只有a打印 10 ,b和c都报错,这就是作用域的问题. 我们把新创建的一个.py文件看做事一个模块,在模块内定义的变量,如a,就是这个模块的全局变量,作

  • python函数局部变量、全局变量、递归知识点总结

    函数局部变量 全局变量 及其作用域 #简单类型(int str等)变量的局部变量与全局变量及其作用域的关系 name = "xxx" #第一级顶头定义的变量都称为全局变量,其作用域从变量定义的位置开始到此程序结束 def Print_Name(): print("name before change:", name) #由于name在此函数之前已经被定义为全局变量,此处函数读取变量name是读取的全局变量name "xxx",函数内部就不能再定义

  • Python3.5局部变量与全局变量作用域实例分析

    本文实例讲述了Python3.5局部变量与全局变量作用域.分享给大家供大家参考,具体如下: 1.局部变量与全局变量定义: 在子程序(函数)中定义的变量称为:局部变量:在程序顶级(一开始)定义的变量称为:全局变量. 2.局部变量与全局变量作用域: 局部变量作用域:定义该变量的子程序:全局变量作用域:整个程序. 当局部变量与全局变量同名时,在定义局部变量的子程序内局部变量其作用:其他地方全局变量起作用. #!/usr/bin/env python # -*- coding:utf-8 -*- # A

  • Python中全局变量和局部变量的理解与区别

    前言 学过编程的人应该对全局变量与局部变量这两个名词并不陌生,Python也同多数编程语言一样,也有全局变量与局部变量的概念 但是与其他编程语言又有所不同 全局变量与局部变量两者的本质区别就是在于作用域 用通俗的话来理解的话, 全局变量是在整个py文件中声明,全局范围内都可以访问 局部变量是在某个函数中声明的,只能在该函数中调用它,如果试图在超出范围的地方调用,程序就爆掉了 如果在函数内部定义与某个全局变量一样名称的局部变量,就可能会导致意外的效果,可能不是你期望的.因此不建议这样使用,这样会使

  • Python中super().__init__()测试以及理解

    目录 python里的super().init()有什么用? Python super().__init__()测试 super() 在 python2.3中的区别 总结 python里的super().init()有什么用? 对于python里的super().__init__()有什么作用,很多同学没有弄清楚. 直白的说super().__init__(),就是继承父类的init方法,同样可以使用super()点 其他方法名,去继承其他方法. Python super().__init__(

  • Python中__init__的用法和理解示例详解

    目录 Python中__init__的用法和理解 补充:Python __init__()类构造方法 Python中__init__的用法和理解 在Python中定义类经常会用到__init__函数(方法),首先需要理解的是,两个下划线开头的函数是声明该属性为私有,不能在类的外部被使用或访问.而__init__函数(方法)支持带参数类的初始化,也可为声明该类的属性(类中的变量).__init__函数(方法)的第一个参数必须为self,后续参数为自己定义. 从文字理解比较困难,通过下面的例子能非常

  • Python中 传递值 和 传递引用 的区别解析

    对于不可变类型传递值(不会影响原数据) 不可变类型 对于可变类型传递引用(会影响原数据) 不可变类型传递引用 python3不可变类型 Number(数字) String(字符串) Tuple (元组) python3可变类型 List(列表) Dictionary (字典) Sets(集合) 参数传递的思考 我们声明的变量名可以看做便签 为变量名赋值的操作可以看做将标签贴到"值"的表面(值可以是可变类型,和不可变类型) 以链表中的节点对象为例(实例化的节点对象为不可变类型, 但对象中

  • Python中print和return的作用及区别解析

    print只是为了向用户显示一个字符串,表示计算机内部正在发生的事情.计算机却无法使用该print出现的内容. return是函数的返回值.该值通常是人类用户看不到的,但是计算机可以在其他功能中使用它. print不会以任何方式影响函数.它只是为了帮助人类使用函数.它对于理解程序如何工作非常有用,并且可以在调试中用于检查程序中的各种值而不会中断程序.除了帮助人类看到人们想要看到的结果,print其余的事情都不做. return是函数返回值的主要方式.所有函数都将返回一个值,如果没有return语

  • 对python中for、if、while的区别与比较方法

    如下所示: if应用举例: #if 若条件成立,只执行一次 #if 条件:如果条件成立,执行条件后的代码块内容,不成立,直接跳过代码块 #判断如果年龄age小于18,输出未成年 #=一个等号表示赋值的意思 ==双等号判断等号两边的值是否相等 if age==18: print('未成年') #两种情况的判断 #如果age小于18 输出未成年,否则输出成年人 #如果条件成立,执行条件后的代码块内容,条件不成立,执行else后的代码块内容,有且只会执行其中某一个代码块 if age<18: prin

  • python中的数组赋值与拷贝的区别详解

    具体的注解我已经写在了程序里面:通俗的解释了python里面的浅拷贝与深拷贝的不同,请看程序. # -*- coding: utf-8 -*- import numpy as np import copy as cp import matplotlib.pyplot as plt import time import math fig = plt.figure() ax = fig.add_subplot(241) # 定义一个多维数组 x = np.array([[1, 2, 3], [4,

  • 浅谈Python中threading join和setDaemon用法及区别说明

    Python多线程编程时,经常会用到join()和setDaemon()方法,今天特地研究了一下两者的区别. 1.join ()方法:主线程A中,创建了子线程B,并且在主线程A中调用了B.join(),那么,主线程A会在调用的地方等待,直到子线程B完成操作后,才可以接着往下执行,那么在调用这个线程时可以使用被调用线程的join方法. 原型:join([timeout]) 里面的参数时可选的,代表线程运行的最大时间,即如果超过这个时间,不管这个此线程有没有执行完毕都会被回收,然后主线程或函数都会接

  • python中sort sorted reverse reversed函数的区别说明

    sort()是可变对象(字典.列表)的方法,无参数,无返回值,sort()会改变可变对象,因此无需返回值. sort()方法是可变对象独有的方法或者属性,而作为不可变对象如元组.字符串是不具有这些方法的,如果调用将会返回一个异常. 代码如下: >>> a=[5,4,3,2,1] >>> a.sort() >>> [1, 2, 3, 4, 5] >>> a >>> [1, 2, 3, 4, 5] sorted()是py

  • python中random.randint和random.randrange的区别详解

    在python中,通过导入random库,就能使用randint 和 randrange 这两个方法来产生随机整数.那这两个方法的区别在于什么地方呢?让我们一起来看看! 区别: randint 产生的随机数区间是包含左右极限的,也就是说左右都是闭区间的[1, n],能取到1和n.而 randrange 产生的随机数区间只包含左极限,也就是左闭右开的[1, n),1能取到,而n取不到.randint 产生的随机数是在指定的某个区间内的一个值,而 randrange 产生的随机数可以设定一个步长,也

随机推荐