Python 全局变量与局部变量区别——global 关键字、__main__ 块与作用域示例

实践结论:在函数内部,只有用 global 声明后,才能定义全局变量或修改已有的同名全局变量;而在 if name _ == 'main _': 块里,直接赋值就是给全局变量赋值,不需要也不能用 global。无论哪种方式定义的全局变量,模块作用域内的其他函数都能访问到。但这两种做法都不是好实践。最好的做法是:把全局变量放在模块的最顶层(所有函数和类定义之外),紧接在 import 语句之后,不要放在 main 块中,也不要放在某个单独的函数里。这样声明位置清晰、执行顺序确定,模块无论被导入还是直接运行,行为都一致,也不会让函数产生隐蔽的全局副作用。

全局变量:

1、在函数外部定义

2、在函数内使用global关键字定义一个变量,如果该函数不被调用,则该全局变量不生效;只有该函数被调用,该全局变量才生效,之前没有同名全局变量,则创建,之前已有同名全局变量,则修改即覆盖之前的同名全局变量。

3、函数内部没有先定义一个变量而直接访问这个变量时,访问的是全局变量,如果这个全局变量没有定义,则会报错

4、函数外部访问一个变量,只能访问全局变量,如果这个全局变量没有定义,则会报错

5、全局变量可能导致代码难以维护和调试。因为它能在模块任何地方被读写,代码一长,很难追踪"谁在什么时候改了它",排查问题时要来回找上下文;多个函数同时依赖它时,还容易互相干扰。

局部变量:

1、在函数内部定义且没有 global 关键字。

2、只在该函数内部有效,只在函数执行期间存在,函数结束后被销毁。

3、不同函数的局部变量可以同名,因为每次调用函数都会为该函数创建独立的局部作用域,局部变量只在自己的函数内有效,互不影响。

不同函数内部的局部变量名称相同没有问题,只在各自的函数内部生效

python 复制代码
def function1():
    x = 10  # 局部变量,只在function1中有效
    print("x:", x)
def function2():
    x = 20  # 局部变量,只在function2中有效
    print("x:", x)
function1()
function2()
输出结果:
x: 10
x: 20

局部变量只在函数内部生效

python 复制代码
# function()里面的是局部变量x,print("x", x)在函数外访问的是全局变量x,全局变量x不存在,所以报错
def function():
    x = 30  #局部变量
    print("x:", x)
if __name__ == '__main__':
    function()  
    print("x", x)
输出结果:
x: 30
NameError: name 'x' is not defined

函数内部没有先定义一个变量而直接访问这个变量时,访问的是全局变量,如果这个全局变量没有定义,则会报错

python 复制代码
def function1():
    x = 10  # 局部变量
    print("x:", x)
def function2():
    print("x:", x) 
function1() 
function2()  
输出结果:
x: 10
NameError: name 'x' is not defined

函数内部全局变量和局部变量的区别global关键字示例:

python 复制代码
#代码1,函数内部使用global关键字定义变量,则是全局变量
x = 5  # 全局变量
def function1():
    global x
    x = 30  # 全局变量,会修改之前同名的全局变量
    print("x:", x)
function1()  
print("x:", x) 
输出结果:
x: 30
x: 30

#代码2,函数内部不使用global关键字定义变量,则是局部变量,该局部变量和全局变量同名
x = 5  # 全局变量
def function2():
    x = 30  #  局部变量,函数内部生效,不会修改之前同名的全局变量
    print("x:", x)
function2()  
print("x:", x) 
输出结果:
x: 30
x: 5

全局变量在函数function1中定义,函数function2中一个和全局变量同名的局部变量,函数function3()没有定义变量则只能调用全局变量

python 复制代码
def function1():
    global x
    x = 10  # 全局变量
    print("x:", x)
def function2():
    x = 20  # 局部变量,函数内部生效,不会修改之前同名的全局变量
    print("x:", x)
def function3():
        print("x:", x) # 这个x没有定义,直接使用全局变量
function1()
function2() 
function3() 
输出结果:
x: 10
x: 20
x: 10

if name _ == 'main_': 块里的变量也是全局变量示例:

python 复制代码
# x = 5 覆盖 x = 6,两者都在函数外部都是全局变量(),谁后执行,谁就覆盖之前的。
x =6 # 全局变量
def function():
    print("x:", x)
if __name__ == '__main__':
    x = 5  # 全局变量
    function() 
    print("x:", x)  
输出结果:
x: 5
x: 5

函数内使用global关键字定义一个变量,如果该函数不被调用,则该全局变量不生效;只有该函数被调用,该全局变量才生效

python 复制代码
#代码1,function1() 被调用,x = 7生效,并对全局 x 产生影响。
x = 6                          # 第一步 全局 x = 6
def function():
    print("x:", x)             # 第三步 读全局 x
def function1():
    global x                   # 第四步 声明:全局 x
    x = 7                      # 第四步 全局 x 被改成 7
if __name__ == '__main__':
    x = 5                      # 第二步 全局 x 被改成 5
    function()                 # 第三步 读到全局 x = 5,输出 5
    function1()                # 第四步 全局 x 被改成 7
    print("x:", x)             # 第五步 读到全局 x = 7,输出 7
输出结果:
x: 5
x: 7

#代码2,function1() 没有被调用,x =7不生效, 对全局 x 没有影响。
x = 6                          # 第一步 全局 x = 6
def function():
    print("x:", x)             # 第三步 读全局 x
def function1():
    global x                   
    x = 7                      
if __name__ == '__main__':
    x = 5                      # 第二步 全局 x 被改成 5
    function()                 # 第三步 读到全局 x = 5,输出 5
    print("x:", x)             # 第四步 读到全局 x = 5,输出 5
输出结果:
x: 5
x: 5
相关推荐
終不似少年遊*2 小时前
【AI Coding实战方法论】从计划协作到架构护栏,一套能长期复用的工程流程
人工智能·python·团队开发·ai编程·ai coding·skills·上下文管理
马剑威(威哥爱编程)2 小时前
Python 智能体开发实战 01:装了三遍环境还在报错?虚拟环境和 DeepSeek 一次配到位
开发语言·人工智能·python·agent
octopus_c2 小时前
C++ 入门
开发语言·c++·算法
产品经理爱开发2 小时前
AxureShow(艾可秀)国内通用的html托管
前端·人工智能·html·ai编程
jktantan2 小时前
前端也需要事务:Vue Router 乐观更新、回滚与“过期事务”
前端·javascript·vue.js
卷无止境2 小时前
Skill 的安全边界在哪里:风险来源、验证思路与用户可用的防线
后端·python
TomEval2 小时前
【测AI】第22篇:Agent 系统测试方法 — AI 学会“动手“了
人工智能·python·prompt·aigc·测试用例
怕浪猫2 小时前
K3.1 直追 Astra,先补 13%
前端·javascript·面试
天若有情6732 小时前
【前端趣味项目】把防抖玩出新花样!一个带隐藏后门的毫秒级“读秒挑战”
前端·javascript·html·防抖·外挂·趣味demo·读秒挑战