📜  Python中的全局变量和局部变量

📅  最后修改于: 2020-01-13 11:51:58             🧑  作者: Mango

全局变量是在函数外部定义和声明的变量,有时我们需要在函数内部使用它们:

# 这个函数实用了全局变量s
def f():
    print s
# Global scope
s = "我爱芒果文档"
f()

输出:

我爱芒果文档

如果在函数范围内也定义了相同名称的变量,则它将仅打印函数内部给定的值,而不输出全局变量的值:

# 函数内部的变量s
def f():
    s = "我也是."
    print s
# Global scope
s = "我爱芒果文档"
f()
print s

输出:

我也是.
我爱芒果文档.

在调用函数f()之前,变量s被定义为字符串“ 我爱芒果文档”。f()中唯一的语句是“ print s”语句。如果没有local变量s,打印将使用global的值。
问题是,如果我们在函数f()中更改s的值,将会发生什么?也会影响全局变量吗?我们在以下代码中对其进行测试:

def f():
    print s
    # 如果注释下面的行,程序会报错.
    s = "我也是."
    print s
# 全局变量
s = "我爱芒果文档"
f()
print s

输出:

Line 2: undefined: Error: local variable 's' referenced before assignment

为了使上述程序有效,我们需要使用“ global”关键字。如果我们要进行分配/更改它们,则只需要在函数中使用global关键字即可。为什么?Python“假定”由于要在f()内部分配s而需要局部变量,因此第一个print语句会抛出此错误消息。要告诉Python,我们要使用全局变量,我们必须使用关键字“ global”,如以下示例所示:

# 展示使用global关键字,改变's'
def f():
    global s
    print s
    s = "芒果文档的Python部分"
    print s
# 全局变量
s = "Python很牛!"
f()
print s

现在就没有歧义了。
输出:

Python很牛!
芒果文档的Python部分.
芒果文档的Python部分.

一个很好的例子:

a = 1
#  会使用全局变量a,因为没有本地的a变量
def f():
    print '在f()内 : ', a
# 变量'a'被重新定义成local
def g():
    a = 2
    print '在g()内 : ',a
# 使用global关键字调整global变量'a'
def h():
    global a
    a = 3
    print '在h()内 : ',a
# 全局范围
print 'global : ',a
f()
print 'global : ',a
g()
print 'global : ',a
h()
print 'global : ',a

输出:

global :  1
在f()内) :  1
global :  1
在g()内 :  2
global :  1
在h()内 :  3
global :  3