Python中的全局变量和局部变量详解

太空探索
• 阅读 296

大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。

在Python中,全局变量和局部变量在作用域和访问权限上有明显的区别。全局变量是在整个程序中可访问的变量,而局部变量则仅在其被定义的函数内部可用。

1. 全局变量

# 定义全局变量
global_var = 10

# 全局变量在函数内部也是可访问的
def func_using_global():
    print(f"访问全局变量 global_var 的值:{global_var}")

# 调用函数
func_using_global()

在上面的示例中,global_var 被定义为全局变量,因此它可以在函数 func_using_global() 中访问和使用。

2. 局部变量

# 定义函数,内部有一个局部变量
def func_creating_local():
    local_var = 20
    print(f"局部变量 local_var 的值:{local_var}")

# 调用函数
func_creating_local()

# 尝试在函数外部访问局部变量会导致 NameError
# print(f"尝试在函数外部访问局部变量 local_var:{local_var}")

在此示例中,local_var 被定义为函数 func_creating_local() 内的局部变量。尝试在函数外部访问局部变量将导致 NameError,因为局部变量的作用域仅限于其被定义的函数内部。

3. 全局变量在函数内部的修改

global_var = 10

def modify_global():
    global global_var
    global_var = 30
    print(f"在函数内部修改全局变量 global_var 的值为:{global_var}")

modify_global()
print(f"全局变量 global_var 修改后的值为:{global_var}")

在此示例中,通过在函数内部使用 global 关键字,我们成功地修改了全局变量 global_var 的值为 30,并且这个修改是持久的,影响了整个程序。

4. 局部变量与全局变量的命名冲突

在编程中,当全局变量与局部变量同名时,可能会导致混淆和意外结果。下面是一个示例:

var = 10  # 全局变量

def func():
    var = 20  # 局部变量
    print(f"在函数内部的局部变量 var 值为:{var}")

func()
print(f"在函数外部的全局变量 var 值为:{var}")

这里存在全局变量 var 和函数内部的同名局部变量 var。在函数内部,局部变量 var 的值为 20,但在函数外部,全局变量 var 的值仍为 10。这种命名冲突可能会带来混淆,因此编写代码时需要特别注意。

5. 使用 nonlocal 关键字修改嵌套函数中的变量

Python中,还存在一种嵌套函数的情况,即在函数内定义函数。这时,可以使用 nonlocal 关键字来修改外层函数的局部变量。

def outer_func():
    outer_var = 30  # 外层函数的局部变量

    def inner_func():
        nonlocal outer_var
        outer_var = 40  # 修改外层函数的局部变量
        print(f"嵌套函数内部修改外部函数变量 outer_var 值为:{outer_var}")

    inner_func()
    print(f"外部函数变量 outer_var 修改后的值为:{outer_var}")

outer_func()

这个例子展示了嵌套函数中使用 nonlocal 关键字修改了外层函数的局部变量 outer_var 的值,使其从 30 变为 40。

总结

总结全局变量和局部变量在Python中的区别至关重要。全局变量在整个程序中可被访问,而局部变量仅在其定义的函数内部可见。这种区别涉及作用域和访问权限,影响程序的结构和灵活性。同时,对于避免命名冲突和程序逻辑的清晰性也至关重要。

合理使用全局变量和局部变量可以提高代码的可读性和维护性。同时,对于嵌套函数中局部变量的修改,nonlocal 关键字在修改外层函数的变量值时是非常有用的。通过理解这些概念,能够更好地利用Python的强大功能和灵活性,写出更加优雅和健壮的代码。全局变量和局部变量的正确使用对于构建优秀的程序至关重要。

点赞
收藏
评论区
推荐文章
Dax Dax
4年前
JS核心原理理解闭包
前置概念在正式看闭包之前,我们先来学习一下前置知识,那就是JS中的作用域,我们知道,在ES5之中,作用域分为两种:全局作用域和函数作用域,随着ES6的到来,新增了块级作用域,想更好的理解闭包,那么搞清楚作用域是首要条件全局作用域我们知道,对于变量而言,我们一般会分成两类:全局变量和局部变量,一般定义在最外围环境的为全局变量,定义在函数当中的为局部变量,在we
Karen110 Karen110
4年前
一篇文章带你了解JavaScript作用域
在JavaScript中,对象和函数也是变量。在JavaScript中,作用域是你可以访问的变量、对象和函数的集合。JavaScript有函数作用域:这个作用域在函数内变化。一、本地JavaScript变量一个变量声明在JavaScript函数内部,成为函数的局部变量。局部变量有局部作用域:它们只能在函数中访问。JS://codeherecann
Karen110 Karen110
4年前
一篇文章带你了解JavaScript 函数闭包
大家好,我是前端进阶者。JavaScript变量属于本地或者全局范围,使用闭包可以让私有变量成为可能。一、全局变量一个函数可以访问所有定义在函数内部的变量。functionmyFunction()vara4;returnaa;但是函数也可以访问定义在函数之外的变量。vara4;//全局变量funct
菜园前端 菜园前端
2年前
为你解惑JS作用域和作用域链知识
原文链接:变量作用域一个变量的作用域(scope)是程序源代码中定义这个变量的区域。全局变量拥有全局作用域,在JavaScript代码中的任何地方都是可以访问的。然而在函数内声明的变量只能在函数体内访问,它们是局部变量,作用域是局部性的。函数参数也是局部变
Jacquelyn38 Jacquelyn38
4年前
你所知道的JS变量作用域
变量的作用域,指的是变量在脚本代码中的可读、可写的有效范围,也就是脚本代码中可以使用这个变量的区域。在ES6之前,变量的作用域主要分为全局作用域、局部作用域(也称函数作用域)两种;在ES6及其之后,变量的作用域主要分为全局作用域、局部作用域、块级作用域这3种。相应作用域变量分别称为全局变量、局部变量、块级变量。全局变量声明在所有函数之外;局部变量是在函数体内
Stella981 Stella981
3年前
Javascript 变量 var与不var的区别
1.在函数作用域内加var定义的变量是局部变量,不加var定义的就成了全局变量。使用var定义var a  'hello World';function bb(){    var a  'hello Bill';    console.log(a);   }bb()   // 'hello Bill'conso
Wesley13 Wesley13
3年前
IOS全局变量
IOS中的全局变量和JAVA中的全局变量定义和使用方法不一样,在Java中,只需要将变量定义为static就行了。而在IOS中这种方法不适合。IOS中定义全局变量有三种方法:1.使用extern关键字在AppDelegate.m或AppDelegate.h中写入你需要的全局变量名,例如:int name;注意定义全局变量时候不能初始化,否则报错
Wesley13 Wesley13
3年前
C语言面试题大汇总之华为面试题 Eddy整理
1、局部变量能否和全局变量重名?  答:能,局部会屏蔽全局。要用全局变量,需要使用"::";局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。2、如何引用一个
Stella981 Stella981
3年前
JavaScript 使用闭包保护变量 防止污染
使用JavaScript编写插件或团队协作时,可使用闭包来解决此类以下两个问题:1、定义过多全局变量,可能会造成全局变量命名冲突;2、在插件内定义变量,需要保护该变量不被轻易修改;优点:可以把局部变量驻留在内存中,可以避免使用全局变量;在调用过后不会被垃圾机制回收;缺点:避免滥用闭包,占用更多内存的缺点,用完要及时让垃圾回收器回收(fn
Wesley13 Wesley13
3年前
OC常量、变量、属性及其特性
1.ObjectiveC中声明常量使用关键字const。如:constdoublePI3.1514;2.ObjectiveC中变量可以分为成员变量、局部变量和全局变量(用的很少,尽量不要用)。//————————常量—————————————————//方法一:definekDetailKey  
Wesley13 Wesley13
3年前
C语言内存优化——继续含泪总结
之前分析了基本数据类型的优化,现在开始涉及全局和局部变量的优化,话说这个东西我从没想过还能这样优化的喂!全局变量/Globalvariables全局变量不会被分配在寄存器上,修改全局变量需要通过指针或者调用函数的方式间接进行。所以编译器不会将全局变量存储在寄存器中,那样会带来额外的、不必要的负担和存储空间。所以在比较关键的循环中,我们要
太空探索
太空探索
Lv1
轻叹时光,年华甚好,奈何伊人离去。
文章
4
粉丝
0
获赞
0