Python global

python中的那些全局变量

global的使用

如下代码,print(x),会输出几呢? 答案是1。我们可能会说,python不是弱类型语言吗,我在前面定义了x,在函数内修改了为啥不可见呢? 然而恰恰是因为python是弱类型,fun内的x肯定是函数内部的新变量,而不是外部的变量x。 因此,如果我们想要拿到函数内部修改的值,要么用返回值,要么用global修饰(标识全局变量)。 我们可能会疑惑,python不是基于地址传递的吗,为啥不能通过参数传递来获取内部值得变更呢? 这里与java类似,虽然是基于地址或者引用传递,但是传递的是地址,你重新赋值后,变量已经不指向原来的内存空间了,因此修改对于外部而言是不可见的。这里可能比较拗口,实际上要表达的意思就是:基于地址传递,实际上是基于共享内存,如果重新赋值后,并通过新赋值的句柄操作,那么实际上是操作了另外的共享内存,而非参数传递的共享内存

1
2
3
4
5
6
7
8
9
10
#! /usr/bin/env python
# coding: utf-8

x = 1

def fun():
x = 2

fun()
print(x)
1
2
D:\Users\hp.he\Anaconda3\envs\grapCut\python.exe C:/Users/hp.he/PycharmProjects/GrapCut/test.py
1

多文件共享变量

如下两个文件:testa.py

1
2
3
4
5
6
7
8
9
10
11
12
13
#! /usr/bin/env python
# coding: utf-8
# testa.py

x = 1


def fun():
global x
x = 2


fun()
1
2
3
4
5
6
7
#! /usr/bin/env python
# coding: utf-8
# testb.py

import test

print(test.x)

那么运行testb.py,输出的结果是多少? 输出“2”, 为啥是2,而不是1呢? 在倒入库的时候,你可以理解未python解释器已经执行了一遍代码,因为testa.py中用fun()调用,因此执行了一遍函数,又因为是global修饰,so,就变成了2。

其实多文件共享变量,类比与java中的类变量,视乎有状态,视乎又没有状态。