全局变量

这里的全局变量说的都是模块内的全局变量

name = 'Yi_Zhi_Yu'

def test_a():
    print(name)

test_a() # Yi_Zhi_Yu

这里的name的 就是一个全局变量, 所以我们在模块的函数内可以直接打印

但如果在函数内修改name的话, 会发生什么呢

ame = 'Yi_Zhi_Yu'

def test_a():
    name = 'Tony'
    print(name)

test_a() # Tony
print(name) # Yi_Zhi_Yu

可以看出在函数内对全局变量name做修改的时候, name变成了局部变量, 但也仅限于函数内,

外部的全局变量依旧没有改变

那有没有什么方式能在函数内修改全局变量?

global 关键字

global关键字

函数内的变量被声明为global后, 对该变量的的修改就可以影响到全局变量

name = 'Yi_Zhi_Yu'

def test_a():
    global name
    name = 'Tony'
    print(name)

test_a() # Tony 
print(name) # Tony

可以看到全局变量被修改了

全局变量引入

c.py 文件里

name = 'Yi_Zhi_Yu'

def test_a():
    global name
    name = 'Tony'
    print('test_a:{}'.format(name))

d.py 文件中

from c import name, test_a
import c

test_a()

print('c.name: {}'.format(c.name))
print('name: {}'.format(name))

运行d.py, 在d.py 中的输出的两行应该是什么呢

可能有人会说是

c.name: Tony
name: Tony

也有人可能会说

c.name: Yi_Zhi_Yu
name: Yi_Zhi_Yu

然而事实上是

c.name: Tony
name: Yi_Zhi_Yu

在我们运行了test_a() 后, 该函数内的global name 被从Yi_Zhi_Yu更改成了Tony,

所以c.name 变成了 Tony

但通过from c imoprt name 的到的name, 却没有发生改变, 是因为什么

这个应该是因为通过from ... import ...import ... 引入的变量, 一个属于原有模块的命名空间, 一个属于当前模块的命名空间, 在原有模块内, 通过global对全局变量的修改, 也仅限于该命名空间

如上, from c import name 得到的name 属于d.py这个文件模块的命名空间内, 而import c 得到的c.name 属于c 的命名空间, test_a 修改的也是c.py 文件模块的命名空间内的name

所以,

运行d.py模块时, c.name 得到的是Tony, name得到的是Yi_Zhi_Yu

right