写在最前面: python
python中全局变量和局部变量的最大区别在于局部变量只能经过函数去访问,而全局变量能够直接访问。bash
!!! 函数
咱们先来看一个最简单的例子,事实上这并非一个真正的全局变量,只是在类中的一个变量。 ui
!!! spa
咱们先从类中的变量访问开始讲起 那么咱们要如何访问这个变量呢?
code
class variable:
a = '我是类变量'
def showvarible(self):
b = '我是函数变量'
print(a)
print(b)
variable().showvarible()复制代码
毫无疑问,编译器就已经报错了,这是由于类中的变量不能够在函数中直接访问,应该这样
leetcode
class variable:
a = '我是类变量'
def showvarible(self):
b = '我是函数变量'
print(variable.a)
print(b)
variable().showvarible()复制代码
我是类变量
我是函数变量复制代码
其实咱们还能够经过self去访问
字符串
class variable:
a = '我是类变量'
def showvarible(self):
b = '我是函数变量'
print(self.a)
print(b)
variable().showvarible()复制代码
结果是同样的
编译器
我是类变量
我是函数变量复制代码
还能够怎么作呢,咱们经过构造函数给定一个参数,类中可访问
string
class variable:
def __init__(self,a):
self.a = '我是类变量'
def showvarible(self):
b = '我是函数变量'
print(self.a)
print(b)
variable(1).showvarible()复制代码
我是类变量
我是函数变量复制代码
这里须要注意的是,实例化的时候必须给参数,因为python是动态语言,不须要指定参数的类型,你能够放int,好比1,也能够给一个字符串。
而后咱们真正看一下全局变量
a = '我是真正的全局变量'
def showvariable():
b = '我一直都是局部变量'
print(a)
print(b)
showvariable()复制代码
我是真正的全局变量
我一直都是局部变量复制代码
当咱们试图在函数外访问这个函数的局部变量时
a = '我是真正的全局变量'
def showvariable():
b = '我一直都是局部变量'
print(a)
def showb():
print(b)
showvariable()复制代码
报错
我是真正的全局变量
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 13, in <module>
showb()
File "F:/leetcode/xxx.py", line 9, in showb
print(b)
NameError: name 'b' is not defined复制代码
说明局部变量只能在局部使用。
那么不巧的是,个人局部变量和全局变量定义了同一个名称,谁的优先级更高呢?
a = '我是真正的全局变量'
def showvariable():
a = '我一直都是局部变量'
print(a)
print(a)
showvariable()复制代码
果真,函数优先使用了局部变量
而优先级还有一个体现,来看下面的例子
a = 3
def showvariable():
a = a * 5
print(a)
showvariable()复制代码
你可能会认为输出15,可是上面的一个例子告诉咱们,在函数内会优先使用局部变量
3
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 10, in <module>
showvariable()
File "F:/leetcode/xxx.py", line 5, in showvariable
a = a * 3
UnboundLocalError: local variable 'a' referenced before assignment复制代码
这样是由于,咱们在函数内定义了一个局部变量a,可是还没来得及赋值,就被*5,编译器不知道拿谁去*5,固然报错了。
下面讲讲global,global第一次是只能定义不能赋值的
def showvariable():
global a
a = '我是global'
print(a)
showvariable()复制代码
我是global复制代码
固然是能够在函数外访问的
def showvariable():
global a
a = '我是global'
print(a)
def showglobal():
print(a)
showvariable()
showglobal()复制代码
复制代码
我是global
我是global复制代码
可是,必须赋值后才有意义,若是像这样
def showvariable():
global a
a = '我是global'
print(a)
def showglobal():
print(a)
print(a)
showvariable()
showglobal()复制代码
在没有赋值的时候,就去打印
Traceback (most recent call last):
File "F:/leetcode/xxx.py", line 9, in <module>
print(a)
NameError: name 'a' is not defined复制代码
由于此时global a尚未赋值,固然不能打印。