-
2020-09-01 16:32:06
1.全局变量
在计算机中,一切数据都可以当作变量。理论上讲,变量可以分为几种类型:
1)全局变量;
2)静态变量;
3)常量;
4)栈变量;
5)堆变量。
这些变量的不同在于作用域和生命周期是不同的。对于其中的全局变量来说,必须要注意是,其作用域属于全部,生命周期存在于进程整个时期。
2.python的全局变量
以前笔者写过一篇博客,是有关Golang语言的全局变量的(https://blog.csdn.net/wangzhezhilu001/article/details/91493594)。Golang中,全局变量属于包。在python中,全局变量的生命也属于模块(表现为单个python文件),而不是整个进程。
可以通过如下程序验证。先提供一个文件A.py
# A.py # ---- coding=utf-8--A--# def f(a): print(a) def main(): global a a = 5 f(a) if __name__ == '__main__': main()
再加上另一个调用程序B.py。
# B.py # ---- coding=utf-8----# from A import f def main(): global a f(a) if __name__ == '__main__': main()
运行B.py,发现程序报错。会提示程序变量a不存在。其原因在于,全局变量a并未定义,而B文件的全局变量a的作用域和生命空间只属于B文件。
3.Python的全局变量的用法
python的全局变量的用法为:1)python的全局变量的作用域为特定模块之内;2)在函数内,如不加global关键字,则该变量为局部变量,如该变量未声明,如对变量进行修改,会出问题。
测试程序如下所示:
# C.py # ---- coding=utf-8----# a = 2 def f(a): print(a) def main(): a += 1 f(a) if __name__ == '__main__': main()
该方法会提示a为本地变量。
要想使用,必须在函数内提供global关键字,才会让global变量起作用。
# C.py # ---- coding=utf-8----# a = 2 def f(a): print(a) def main(): global a a += 1 f(a) if __name__ == '__main__': main()
4.Python的全局变量实质
python的全局变量的实质是:python在程序运行时,提供了一个__globals__字典,__globals__字典属于模块,并把全局变量放入字典里。这种方式,决定了python的全局变量不属于进程而属于模块。
更多相关内容 -
Python全局变量与局部变量区别及用法分析
2020-12-25 06:31:24本文实例讲述了Python全局变量与局部变量区别及用法。分享给大家供大家参考,具体如下: 对于很多初学的同学,对全局和局部变量容易混淆,看看下面给大家的讲解相信都应该明白两者的区别了。 定义: 全局变量:在... -
Python全局变量用法实例分析
2020-09-21 14:21:35主要介绍了Python全局变量用法,结合实例形式分析了Python中全局变量的定义、使用方法与相关注意事项,需要的朋友可以参考下 -
Python全局变量操作详解
2020-09-22 06:12:24主要介绍了Python全局变量操作详解,本文总结了两种使用全局变量的方式,需要的朋友可以参考下 -
Python教程之全局变量用法
2020-12-23 20:55:33本文实例讲述了Python全局变量用法。分享给大家供大家参考,具体如下: 全局变量不符合参数传递的精神,所以,平时我很少使用,除非定义常量。今天有同事问一个关于全局变量的问题,才发现其中原来还有门道。 程序... -
python 全局变量
2020-12-10 23:06:00在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是 LGB (不考虑闭包情况)即local本地,global全局,builtin内建。比如:a = 1def test():a = 3print(a)test()函数内声明了局部变量 a ,在打印中使用,在...理解的都没问题。但我想聊聊出现这种情况的原因。在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是 LGB (不考虑闭包情况)即local本地,global全局,builtin内建。比如:
a = 1
def test():
a = 3
print(a)
test()
函数内声明了局部变量 a ,在打印中使用,在本地环境中命中,因此使用的是 3。
也许你会问这个知识点我早就知道了,这和本问题有什么关系呢?
有的,难道你不觉得奇怪吗?报错是变量未初始化,而不是变量未定义。
题目中函数内 c= c+1 就已经表明了声明的变量 c 是属于局部变量的。 按理说,先执行赋值语句右侧,而此时 c 并没有声明,应该在全局环境命中才对啊。所以想象中的结果应该是局部变量 c = 2 而全局变量的 c 保持原值。
但是,这只都是想当然。讲了这么多其实我是想引出,python虽然是动态语句,但它还是会对代码做扫描工作的,会有收集有用的静态信息。函数的应该信息会放在 code 对象中,里面的信息就包含了局部变量名称的集合,可以通过 co_varnames 得到,如下:
c = 1
def test():
c= c+1
a = 3 # 另一个局部变量
print(c)
print(test.__code__.co_varnames) # ('c', 'a')
因此,函数test在执行前,变量 c 就已经被声明在局部变量环境中了,而不是我们自认为的当赋值语句运行后才会在局部变量里。于是,这就导致了报错信息是变量未初始化而不是变量未定义。
====== 分割线 =========
题主评论要求:
关于变量的初始化,定义,创建这三者关系,能帮忙疏导一下理解吗?
这三个意思基本差不多,没必要分得太开。把变量环境理解成一个字典 name_env = dict() 其实就很好理解了(事实上python底层也确实是这样处理的)。对于在这个环境内要创建一个名为 a 的变量,就可以是 name_env['a'] = value 的形式了。
这个过程也就是赋值语句形如 a = value 时会调用赋值的指令 STORE_NAME 。我们看一下这个赋值过程你就理解了。
这部分代码在 ceval.c 中,详见 ceval.c
TARGET(STORE_NAME) {
PyObject *name = GETITEM(names, oparg);
PyObject *v = POP();
PyObject *ns = f->f_locals;
int err;
if (ns == NULL) {
PyErr_Format(PyExc_SystemError,
"no locals found when storing %R", name);
Py_DECREF(v);
goto error;
}
if (PyDict_CheckExact(ns))
err = PyDict_SetItem(ns, name, v);
else
err = PyObject_SetItem(ns, name, v);
Py_DECREF(v);
if (err != 0)
goto error;
DISPATCH();
}
代码不多,可以逐个分析下,第一行获得的 name 就是赋值语句 a = value 的 a,a以python类型 str 形式存在。第二行 v 从栈中获取,也就是 value 的值。第三行 ns 是从帧对象中获得局部变量环境(大多数情况下是个字典类型,如果帧环境不在函数或类中,取得的是全局变量环境)。PyDict_SetItem(ns, name, v); 和 PyObject_SetItem(ns, name, v); 就可以理解为 ns[name] = v 和 setattr(ns, name, v) 了,创建过程就是这样了。
变量究竟是创建还是初始化还是覆盖已有的变量值,其实底层并不关心。
回到本地中,本地变量的符号表会保存在静态信息里面,我猜测搜索变量时有优先去静态信息中得到信息,来更快的知道变量应该是在局部还是全局中查找吧。
-
python 全局变量的import机制介绍
2020-09-21 04:25:26在之前学习python设计模式(工厂模式实践篇),希望使用全局变量代替c++的宏完成服务自动注册功能时,遇到过一个问题,全局变量的定义和使用放在同一个可执行脚本中的问题 -
Python全局变量与global关键字常见错误解决方案
2020-12-16 23:58:29在Python的变量使用中,经常会遇到这样的错误: local variable ‘a’ referenced before ... 原来,在Python中,a=3 定义了全局变量a,作用域从定义处到代码结束,在 a=3 以下的函数中是可以引用全局变量a的,但如果 -
Python全局变量是什么?Python全局变量怎么使用?
2021-01-14 19:00:27Python全局变量是什么?Python全局变量怎么使用?通常可以将任何编程语言中的变量定义为用于以特定名称存储值的元素,并且该变量在存储器中用作存储单元中的标识对象。它可以有两种类型,全局变量和局部变量,其中...Python全局变量是什么?Python全局变量怎么使用?通常可以将任何编程语言中的变量定义为用于以特定名称存储值的元素,并且该变量在存储器中用作存储单元中的标识对象。它可以有两种类型,全局变量和局部变量,其中全局变量可以在整个程序的函数外部访问,而局部变量只能在函数内部访问。
但是在python中,如果在函数内部声明了变量,则默认情况下它是局部变量。同样,如果在函数外部声明变量,则默认情况下它是全局变量。
1.什么是全局变量?
全局变量是函数或程序外部的变量,但是可以使用关键字“全局”将它们设置为函数内部的那些变量的全局变量。
句法:
a=“valueforvariable”
deffunction_name():
globala
statement(s)
2.Python全局变量的示例
让我们考虑一个示例,以更好地理解全局变量的工作。
例子1
a=1
defadd_func():
print(a)
add_func()
输出:1
在上面的示例中,当您打印“a”的值或调用函数时,变量“a”默认情况下是全局变量,然后将其打印为输出。但是,如果我们要访问变量“a”正在更改的值,那么当我们调用函数add_func()时,将收到一条错误消息,指出变量“a”是局部变量。因此,为了避免此类问题,我们使用全局变量。
例2:
a=1
defadd_func():
a=a+1
print(a)
add_func()
输出:错误,这将导致错误,指出变量“a”是局部变量。
例子3:
defout_func():
x=20
defin_func():
globalx
x=25
print("Beforein_func()valueofxis:",x)
in_func()
print("Afterin_func()valueofxis:",x)
out_func()
print("Theoriginalvalueofxisorchangedvalueofxis:",x)
输出:d
上例中嵌套函数中的全局变量的示例,在上述程序中,我们在in_func()中声明了全局变量,而out_func()中的变量“x”的值保持不变,因为它不是in_func()的全局变量因此,对于在out_func()中的变量“x”在in_func()内部声明的关键字global无效。在调用in_func()之前和之后,变量“x”的值仍为20,因为它将其作为局部变量。同样,out_func()外部的变量“x”的值将为25,因为我们已使用global关键字在in_func()内部创建了全局变量。因此,如果我们在in_func()函数内部对变量“x”进行了任何更改,那么即使在in_func()外部,即out_func()之外,这也反映了变量值的变化。
在Python中,要访问函数内部的局部变量和全局变量,我们需要使用globals()函数,该函数返回当前程序中的项目列表,并且可以用于访问或修改全局变量,而无需使用global关键字。可以在下面的示例中显示。
Python编程语言中的全局变量可以正常工作,这对于访问或获取可以声明全局变量的变量的更改值很有用。如果变量是在函数外部声明的,则默认情况下是全局的,但是如果我们希望函数内部的变量也是全局的,则必须在函数内部声明的变量之前使用global关键字。如上面的示例所示,可以以各种方式声明和使用局部变量和全局变量。
-
Python跨文件全局变量的实现方法示例
2020-09-21 00:25:52我们在使用Python编写应用的时候,有时候会遇到多个文件之间传递同一个全局变量的情况。所以下面这篇文章主要给大家介绍了关于Python跨文件全局变量的实现方法,需要的朋友可以参考借鉴,下面来一起看看吧。 -
解析python的局部变量和全局变量
2020-12-31 13:55:35局部变量 什么是局部变量 通俗定义:函数内部定义的变量就叫局部变量。 话不多说,代码如下: def test1(): a = 300 # 定义一个局部变量a,并初始化300 print(--test1--修改前:a=%s % a) a = 200 # 给变量a重新... -
Python 专题六 局部变量、全局变量global、导入模块变量
2020-09-21 09:59:52本文主要讲述python全局变量、局部变量和导入模块变量的方法。具有很好的参考价值,下面跟着小编一起来看下吧 -
python全局变量的声明和使用
2021-01-29 09:54:42python中在哪些情况下必须使用global来声明全局变量小编选择离开,不是想成全,不是想放弃,只是想你小编重新认识。以下是一个多线程的python代码片段,其中的x,l都是全局变量,但在threadcode()函数中只声明了...python中在哪些情况下必须使用global来声明全局变量小编选择离开,不是想成全,不是想放弃,只是想你小编重新认识。
以下是一个多线程的python代码片段,其中的x,l都是全局变量,但在threadcode()函数中只声明了global x没有global l。完整的代码是可以成功运行,但是把global x注释掉后就会报错。这是为什么,Lock对象比较特殊吗? [python] view plain copy im大提琴的声音就象一条河,左岸是小编无法忘却的回忆,右岸是小编值得紧握的璀璨年华,中间流淌的,是小编年年岁岁淡淡的感伤!
python中怎么定义全局变量幸福就好,不要晒出来。因为晒多了,迟早有天会晒干的。
复制代码 count = 0 def Fuc(count): print count count += 1 for i in range(0, 10): Fuc(count) 复制代码 结果是: 不是小编们想要的结果。 解决之道一——全局变量: 复制代码 global a a = 3 def Fuc(): global a print a a = a + 1 if __name__看着你离去的背影,脑袋里迅速闪着小编们的过去.
Python有全局变量吗?和C语言一样的,在前面先声明看作用域来确定变量范围。 python有全变量,一般跟c里面是一样的 bar = 'python' def foo1(): bar = 'hello' # 这里是局部变量 print(bar) # 打出hello,并且不会影响全局变量bar(全局那个bar仍然是'python') def foo2(): print(bar) # 打出py情人节了,让你们的男朋友女朋友把花抱稳了,要是玫瑰枝子戳到小编没有三五十万小编起不来的。
python 如何定义全局变量python定义全局变量的方法:python需要用到关键字“global 变量名&python定义全局变量的方法: python需要用到关键字“global 变量名”的方式来定义全局变量。 例如:定义全局变量student,“global student”就代表定义了一个全局变量student 示例如下: 更多Python知识,请关注:Python自学网。。
python 全局变量怎么用
在内部用之前加上global x的声明,就是全局变量 两个例子 a=1def f(): a=2 print af()print aa=[1]def f(): a[0]=2 print a[0]f()print a[0]第一个函数里一旦a=2这样写,就相当于定义了一个新的变量a,这个变量a只在函数内有效。
自动化测试时需要使用python,请问如何理解python提供理解供参考: 简单点来说: 你的未来就是由一份试卷决定的,因为你在中国。
在python中,全局变量可以直接访问,而局部变量只能在定义的块(如函数体)内部或是通过函数访问。 可怕的不是不爱,而是爱了也白爱。因为那个你爱的人他已经有爱的人了。
同名的变量,会优先使用局部变量。 为更好理解,示例代码如下: 代码运行结果: 与怪物战斗的人,应当小心自己不要成为怪物。当你远远凝视深渊时,深渊也在凝视你。
python全局变量一定要用global来做声明吗一个多线程的python代码片段,其中的x,l都是全局变量,但在threadcode()函数中只声明了global x没有global l。 完整的代码是可以成功运行,但是把global x注释掉后就会报错。
python 怎么定义全局变量
你直接定义的localvar是个全局变量;而test()这个函数中会定义(或重绑定)全局变量localvar为6。 可以这样理解:函数是一个盒子,所有函数体里定义的变量都只能在盒子里存在。但是global关键字让函数可以定义能拿到盒子外的变量(所以。
在函数中对变量赋值,默认是局部变量。
全局变量说明前再加static 构静态全局变量全局变量本身静态存储式静态全局变量静态存储式两者存储式并同两者区别虽于非静态全局变量作用域整源程序源程序由源文件组非静态全局变量各源文件都效静态全局变量则限制其作用域即定义该变量源文件内效虽然不能满足你最大的物质生活…但小编可以把小编的心来满足你
-
Python全局变量和局部变量
2020-12-03 11:55:28在诸如C/C++、java等编程语言中,默认在函数的内部是能够直接訪问在函数外定义的全局变量的,可是这一点在python中就会有问题。以下是一个样例。test.py:#!/usr/bin/pythonCOUNT=1def func():COUNT = COUNT + 1func... -
Python基础——全局变量与局部变量
2020-12-21 20:50:29全局变量 1.局部变量 在 def 中, 我们可以定义一个局部变量, 这个变量 a 只能在这个功能 fun 中有效, 出了这个功能, a 这个变量就不是那个局部的 a. def fun(): a = 10 print(a) return a+90 print(fun()) 下面... -
图解python全局变量与局部变量相关知识
2021-01-02 23:31:48这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解一下作用... -
Python 进程之间共享数据(全局变量)的方法 python 全局变量赋值的问题
2021-02-04 09:35:45一个进程怎么访问另个进程的全局变量一个进程访问另一个进程的全局变量,可以通过进程间通信实现。 进程间通信理论上可以用以下几种方式实现。目前的趋势还是以通过socket通信相对比较好。 管道( pipe ) 有名管道 ... -
Python 全局变量使用
2020-12-09 21:21:38这篇文章记录是我在使用Python全局变量的一些体会,写的不是很好,欢迎大家指正!一,使用全局变量首先展示一段不能修改全局变量的代码:gl_string ="hello Python" # 定义全局变量gl_stringprint(i... -
python全局变量 | 跨文件模块使用的一种实现方法
2022-04-06 15:16:31使用一个模块来专门管理全局变量,其他模块再通过导入该模块来间接对全局变量进行操作。 为了避免造成全局变量的赋值混乱,对于每一个全局变量,可以有多个模块读取该全局变量,但尽量只有一个模块用来对其进行赋值... -
Python全局变量与局部变量详解
2021-03-17 17:38:49Python全局变量与局部变量详解#Python中的变量:全局变量和局部变量#在很多语言中,在声明全局变量的时候,都喜欢把全局变量的名称定义为大写#定义学生人数为100STUDENT_NUMBER = 100#学校名称SCHOOL_NAME = '... -
python基础教程:图解python全局变量与局部变量相关知识
2021-01-20 02:51:49这篇文章主要介绍了图解python全局变量与局部变量相关知识,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 了解全局变量和局部变量之前,我们先来了解一下作用... -
python全局变量的定义与使用
2020-12-30 07:57:04使用时再次声明即全局变量在使用之前就要声明,声明全局变量使用关键字 global,然后在使用该全局变量之前,需要再次声明示例global val #在使用前初次声明val = 10 #给全局变量赋值def xy():global val #再次声明,... -
Python 全局变量与局部变量
2020-12-22 03:04:19本文通过一个案例说明 Python 中全局变量用法与 Java 的不同。(ps:一直在用 Java 的方式用 Python,所以踩了一个坑)觉得无聊可以直接看文末总结。 局部变量与全局变量的概念 以下摘自百度百科: 变量分为局部与... -
python全局变量与局部变量
2020-12-05 19:34:46了解全局变量和局部变量之前,我们先来了解一下作用域a = 10deffunc():b= 20definner():c= 30以上面这个程序为例:打印a,b,c可以看到只有a打印 10 ,b和c都报错,这就是作用域的问题。我们把新创建的一个.py文件看... -
python全局变量引用与修改过程解析
2021-01-20 04:04:15这篇文章主要介绍了python全局变量引用与修改过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一、引用 使用到的全局变量只是作为引用,不在函数中修改... -
python跨文件使用全局变量的实现
2020-12-16 23:32:04Python 定义了全局变量的特性,使用global 关键字修饰 global key_word 但是他的一大缺陷就是只能本module 中也就是本文件中使用,跳出这个module就不行。 try 1: 使用一个更宏观的思路,全局变量就用全局加载的... -
python 全局变量与局部变量讲解
2020-12-06 11:12:20本文将详细分析python的全局变量与局部变量,学过php的人都知道,php里面的全局变量是无法在function里面去使用的,只有超全局变量才可以,那么python会怎么处理全局变量与局部变量呢?下面我们来看一下:其实python...