python中的那些全局变量
global的使用
如下代码,print(x),会输出几呢? 答案是1。我们可能会说,python不是弱类型语言吗,我在前面定义了x,在函数内修改了为啥不可见呢? 然而恰恰是因为python是弱类型,fun内的x肯定是函数内部的新变量,而不是外部的变量x。 因此,如果我们想要拿到函数内部修改的值,要么用返回值,要么用global修饰(标识全局变量)。 我们可能会疑惑,python不是基于地址传递的吗,为啥不能通过参数传递来获取内部值得变更呢? 这里与java类似,虽然是基于地址或者引用传递,但是传递的是地址,你重新赋值后,变量已经不指向原来的内存空间了,因此修改对于外部而言是不可见的。这里可能比较拗口,实际上要表达的意思就是:基于地址传递,实际上是基于共享内存,如果重新赋值后,并通过新赋值的句柄操作,那么实际上是操作了另外的共享内存,而非参数传递的共享内存
1 | #! /usr/bin/env python |
1 | D:\Users\hp.he\Anaconda3\envs\grapCut\python.exe C:/Users/hp.he/PycharmProjects/GrapCut/test.py |
多文件共享变量
如下两个文件:testa.py
1 | #! /usr/bin/env python |
1 | #! /usr/bin/env python |
那么运行testb.py,输出的结果是多少? 输出“2”, 为啥是2,而不是1呢? 在倒入库的时候,你可以理解未python解释器已经执行了一遍代码,因为testa.py中用fun()调用,因此执行了一遍函数,又因为是global修饰,so,就变成了2。
其实多文件共享变量,类比与java中的类变量,视乎有状态,视乎又没有状态。