学习记录-Python的局部变量和全局变量

目录

  • 1 定义
  • 2 作用域的重要性
    • 2.1 全局作用域中的代码不能使用任何局部变量
    • 2.2 局部作用域中的代码可以访问全局变量
    • 2.3 不同局部作用域中的变量不能相互调用
    • 2.4 在不同的作用域中,可以使用相同的名字命名不同的变量
  • 3 全局变量与局部变量同名
  • 4 global
  • 5 全局变量和局部变量的优先级
  • 参考内容
1 定义
  • 在被调用函数内赋值的变量是局部变量
  • 在所有函数之外赋值的变量是局部变量
当一个函数被调用的时候 , 就会创建一个局部作用域,在这个函数内的所有变量都存在于该局部作用域内(global的变量除外),该函数返回时 , 这个局部作用域被销毁 , 这个局部作用域内的局部变量随之丢失
2 作用域的重要性
  1. 全局作用域中的代码不能使用任何局部变量
  2. 局部作用域中的代码可以访问全局变量
  3. 一个函数的局部作用域中的代码,不能使用其他局部作用域中的变量
  4. 在不同的作用域中 , 可以使用相同的名字命名不同的变量
下面根据具体代码举例说明
2.1 全局作用域中的代码不能使用任何局部变量def spam():egg = 'this is in function spam'spam()print(egg)在函数spam()(局部作用域)中给egg赋值,然后在全局作用域中调用函数spam()
学习记录-Python的局部变量和全局变量

文章插图
运行后显示,egg未被定义
egg是局部变量,而print(egg)中的变量egg是全局变量,全局作用域中的代码不能使用局部作用域中的变量
这一点我理解为:在调用子函数spam()时,创建了一个局部作用域,并在局部作用域中定义了一个局部变量 , 当子函数调用结束后,局部作用域和内部定义的局部变量一起没销毁,因此在全局作用域中 , 找不到egg这个局部变量
2.2 局部作用域中的代码可以访问全局变量def spam():print(egg)egg = 'Outside the function'spam()
学习记录-Python的局部变量和全局变量

文章插图
全局变量在声明或赋值时被创建,直到程序被终止或执行结束
如果在egg赋值前调用函数
def spam():print(egg)spam()egg = 'Outside the function'【学习记录-Python的局部变量和全局变量】
学习记录-Python的局部变量和全局变量

文章插图
这时候会显示变量未被定义
2.3 不同局部作用域中的变量不能相互调用def spam():print(egg)def init():egg = 'this is in init funcion'init()spam()
学习记录-Python的局部变量和全局变量

文章插图
2.4 在不同的作用域中 , 可以使用相同的名字命名不同的变量def spam():egg = 'this is in spam function'print(egg)def init():egg = 'this is in init funcion'print(egg)#egg = 'Out side function'#print(egg)init()spam()
学习记录-Python的局部变量和全局变量

文章插图
两个子函数中都定义了变量egg , 但在打印时,互不影响
3 全局变量与局部变量同名在上面说到,可以在局部作用域中调用全局变量 , 并且在给出的例子中,我们的子函数中只有一个print操作,但如果一个变量既在全局作用域中定义 , 又在局部作用域中定义,那么会出现什么样的打印结果
def spam():egg = 'this is in spam function'print(egg)def init():egg = 'this is in init funcion'print(egg)egg = 'Out side function'print(egg)init()spam()
学习记录-Python的局部变量和全局变量

文章插图
这里我的理解是:在局部作用域要对一个变量进行操作 , Python会先在当前局部作用域查找有没有声明这个变量,如果有 , 就优先使用当前局部作用域中的变量,如果当前局部作用域作用域中没有,才会去全局作用域中寻找
4 globalglobal允许在局部作用域中声明全局变量
def spam():global eggegg = 'In spam function'spam()print(egg)
学习记录-Python的局部变量和全局变量

文章插图
通过使用global语句在局部作用域中声明了一个全局变量egg,当函数spam()调用结束后变量egg并未随之销毁
5 全局变量和局部变量的优先级在上面的例子中说过,如果在全局变量和局部变量同名,那么局部作用域中会优先处理在当前作用域中声明的的变量

推荐阅读