Python中通过函数对象创建全局变量

先看下面这段代码,显然无法work. 因为代码试图在TestVariableScope()中引用一个没有被定义的变量a.所以必须报错,如下图-1.

不过如果你将第2行代码注释掉。代码就能跑通了,如图-2。

问题1来了:TestVariableScope.a 不是也没有被定义吗,为什么可以work呢?解释如下:先看代码第8行,TestVariableScope.a在SetVariable方法中被定义了,SetVariable()又 在TestVariableScope()前被调用。所以TestVariableScope()在被调用的时候TestVariableScope.a已经被定义了。

问题2来了:代码第7行,a也被定义了。为什么TestVariableScope()在引用a是报错呢。区别在于:a 只是SetVariable()中的一个local变量,TestVariableScope当然无法引用SetVariable中定义的局部变量了。因为违反了LEGB原则吗。TestVariableScope.a 就不一样了,他是一个全局变量哦。所以TestVariableScope当然可以访问这个全局变量了,完全不违反LEGB原则。

问题3来了:为什么TestVariableScope.a是个全局变量,而a却不是呢。因为python中函数皆是对象,而且是全局对象。TestVariableScope.a其实就是TestVariableScope这个全局对象下的一个变量而已,自然也是全局变量喽。 见图-3

 1 def TestVariableScope():
 2     print(a)
 3     print(TestVariableScope.a)
 4     TestVariableScope.a=13
 5
 6 def SetVariable():
 7     a=12
 8     TestVariableScope.a=12
 9
10 if __name__==‘Demo‘:
11     print(‘Demo is running‘)
12
13 if __name__ == ‘__main__‘:
14     SetVariable()
15     TestVariableScope()
16     b=TestVariableScope
17     b()

图-1

图-2

图-3

时间: 2024-08-09 22:03:02

Python中通过函数对象创建全局变量的相关文章

Python中的函数对象与闭包

函数在Python中是第一类对象,可以当做参数传递给其他函数,放在数据结构中,以及作为函数的返回结果. 下面的例子为接受另外一个函数作为输入并调用它 1 #foo.py 2 def callf(func): 3 return func() 使用上面的函数: 1 import foo 2 def helloworld(): 3 return 'Hello,World' 4 5 print foo.callf(helloworld) >>>‘Hello,World’ 2.把函数当做数据处理时

python中的函数对象的内存地址是多少

今天和同学讨论一个问题,发现了函数的内存地址和我想象的不一样. 我以为同一个函数,假如给的参数不一样,那么这两个函数的id就不一样. 然后经过实验,发现python为了便于管理函数,所有的函数都放在同一片内存空间里面. func函数是我定义的一个函数,从结果可以看到func函数和print函数的内存地址是一样的. 这应该是python底层定义的,为了便于管理Python的各种函数和自己项目中定义的函数,可以想到,也许其他的地方也是这个管理机制呢. 原文地址:https://www.cnblogs

js中函数对象创建的总结

在JavaScript的函数对象创建方法中,可以分为三种情况: 1:第一种是使用function语句定义函数 1 <script type="text/javascript"> 2 function fun1(){ 3 alert("我的第一个方法"); 4 } 5 6 //这里边JavaScript带参数的时候不需要提前的定义和声明,而且在定义的时候也不需要带参数类型,直接写参数名称.在使用的时候直接传参就行了,传的是啥类型的参数,就是用啥类型的参数

Python中的函数参数

在讲函数参数之前还是简单的讲一下Python中的可变对象与不可变对象. 一.可变对象与不可变对象 在Python中,一切皆对象,python中不存在所谓的传值调用,一切传递的都是对象的引用,也可以认为是传址.所谓可变对象是指,对象的内容可变,而不可变对象是指对象内容不可变(即在其创建后,值不能改变,但可创建新的对象并以同一变量名对其赋值,而旧的对象会被清理掉,这在python里叫对象的垃圾收集).不可变(immutable):int.字符串(string).float.(数值型number).元

Python中的函数详解

声明:转载自伯乐在线 Python中的函数,无论是命名函数,还是匿名函数,都是语句和表达式的集合.在Python中,函数是第一个类对象,这意味着函数的用法并没有限制.Python函数的使用方式就像Python中其他值一样,例如字符串和数字等.Python函数拥有一些属性,通过使用Python内置函数dir就能查看这些属性,如下代码所示: def square(x): return x**2 >>> square <function square at 0x031AA230>

python中的函数、生成器的工作原理

1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c函数)运行foo()函数 首先会创建一个栈帧(stack Frame),在栈帧对象的上下文里面去运行这个字节码. import dis print(dis.dis(foo)) #打印字节码 可以尝试着去打印foo的字节码: 关于字节码的解释: LOAD_GLOBAL:首先导入bar这个函数 CALL

《python源码剖析》笔记 python中的整数对象

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 1. PyIntObject --> long的一个简单包装 typedef struct{ PyObject_HEAD long ob_ival; } PyIntObject; PyInt_Type --> PyIntObject的类型对象.与对象相关的元信息实际上都是保存在与对象对应的类型对象中的 PyTypeObject PyInt_Type = { PyObject_HEAD_I

【和我一起学python吧】python 中的函数

一.函数的定义: Python中使用def关键字定义函数,函数包括函数名称和参数,不需要定义返回类型,Python能返回任何类型: Python代码   #没有返回值的函数,其实返回的是None def run(name): print name,'runing' #函数体语句从下一行开始,并且第一行必须是缩进的 >>>run('xiaoming') xiaoming runing >>>print run('xiaoming') xiaoming runing Non

python进阶一(函数式编程)【2-7 python中匿名函数】

python中匿名函数 高阶函数可以接收函数做参数,有些时候,我们不需要显式地定义函数,直接传入匿名函数更方便. 在Python中,对匿名函数提供了有限支持.还是以map()函数为例,计算 f(x)=x2 时,除了定义一个f(x)的函数外,还可以直接传入匿名函数: 1 >>> map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9])#lambda x 就是定义的一个函数, x * x就是直接传入的函数 2 [1, 4, 9, 16, 25, 36