美文网首页程序员
Python学习-全局变量和局部变量

Python学习-全局变量和局部变量

作者: vincentgemini | 来源:发表于2017-12-03 18:11 被阅读0次
  • 在函数中定义的变量称为局部变量
  • 在函数外定义的变量称为全局变量

在学习Python的时候发现变量访问有些坑,记录如下:

实验过程:

1、在函数内部访问全局变量:

g_global_var = 2017
def function1():
    print(id(g_global_var))

print(id(g_global_var))
function1()
print(id(g_global_var))
结果1.png

发现在函数调用前、函数调用后以及函数内部访问全局变量,变量的地址没有发生变化。

2、以全局变量为参数,调用函数,在函数内部访问变量:

g_global_var = 2017
def function2(var):
    print(id(var))

print(id(g_global_var))
function2(g_global_var)
print(id(g_global_var))
结果2.png

发现在函数调用前、函数调用后以及函数内部访问全局变量,变量的地址没有发生变化。

3、在函数内部修改全局变量:

def function3():
    print(id(g_global_var))
    g_global_var = 2018

print(id(g_global_var))
function3()
print(id(g_global_var))
结果3-1.png

发现程序运行会出错,提示的信息:本地变量在赋值前已经被使用,正确的做法是在使用全局变量前,用global先获取全局变量,然后就可以修改了。如果不修改全局变量(如1)可以不用global获取全局变量。

def function3():
    global g_global_var
    print("修改前:%d"%id(g_global_var))
    g_global_var = 2018
    print("修改后:%d"%id(g_global_var))

print("访问前:%d"%id(g_global_var))
function3()
print("访问后:%d"%id(g_global_var))
结果3-2.png

从输出结果可以发现,修改后全局变量的地址发生了改变,而且函数调用后,函数外部的全局变量的地址也随之发生了变化,也就是说,这种方式可以修改全局变量。

4、以全局变量为参数,调用函数,在函数内部修改变量:

def function4(var):
    print("修改前:%d"%id(var))
    var = 2018
    print("修改后:%d"%id(var))

print("访问前:%d(%d)"%(g_global_var, id(g_global_var)))
function4(g_global_var)
print("访问后:%d(%d)"%(g_global_var, id(g_global_var)))
结果4.png

从输出结果可以发现,修改后变量的地址发生了改变,但函数调用结束后,全局变量的地址没有发生变化,也就是说,这种方式不能修改全局变量。

5、在函数内部修改变量,查看变量修改前后情况:

def function5():
    var = 2017
    print("修改前:%d(%d)"%(var,id(var)))
    var = 2018
    print("修改后:%d(%d)"%(var,id(var)))

function5()

结果5.png

从输出结果可以发现,修改前后局部变量的地址发生了变化。

6、在函数内部修改容器变量,查看变量修改前后情况:

def function6():
    var = [2007]
    print("修改前:%s(%d)"%(var,id(var)))
    var.append(2008)
    print("修改后:%s(%d)"%(var,id(var)))

function6()
结果6.png

从输出结果可以发现,修改前后,列表内容发生了变化,但地址没有发生变化。同理验证全局容器,发现地址也没有变化。

实验结论:

  • 在Python中,赋值操作是会改变变量地址的。

  • 在Python中,类似append操作,是不会改变容器变量地址的。

  • 如果函数内部没有改改全局变量地址的操作,可以直接访问全局变量,不用在访问前加global。

  • 如果函数内部有修改全局变量地址的操作,不可以直接访问全局变量,需要在访问前加global。

  • 在Python中,函数传参是引用传参。尽管是引用传参,但如果函数内部有修改了变量的地址的操作,如赋值操作,则外部变量的内容也不会发生变化。

以上代码可以在GitHub找到。

相关文章

  • python

    函数内全局变量赋值 Python中有局部变量和全局变量,当局部变量名字和全局变量名字重复时,局部变量会覆盖掉全局变...

  • Python精简入门学习(七)

    Python精简入门学习之全局变量和局部变量-局 部 变 量 -全 局 变 量

  • python 局部变量和全局变量使用 2021-11-05

    python 局部变量和全局变量使用 a = 666 def modify_a():global aa = 20...

  • python变量区域的一个坑

    python有两种变量,全局变量和局部变量。 全局变量的scope是整个module,局部变量是函数或者class...

  • Swift-全局变量、局部变量以及类型属性

    全局变量和局部变量 全局变量和局部变量 计算属性和属性观察器所描述的功能也可以用于全局变量和局部变量。全局变量是在...

  • C语言特性(局部变量和全局变量)

    局部变量和全局变量 局部变量 局部变量根据定义形式的不同,又分为如下三种。 全局变量 在一个函数内部,如果全局变量...

  • 15 C变量的作用域

    1、局部变量和全局变量

  • 9道常见C语言面试题

    1、局部变量能否和全局变量重名? 答:能,局部会屏蔽全局。要用全局变量,需要使用"::" ;局部变量可以与全局变量...

  • python基础

    1.局部变量、全局变量 在函数内部修改全局变量时局部变量会创建一个和全局变量一样名称的局部变量,在更改的时候只会更...

  • 类,变量,迭代器

    1、变量 python中实际有4种变量,分别是全局变量,类变量,实例变量,局部变量。 - 全局变量:类之外的变量,...

网友评论

    本文标题:Python学习-全局变量和局部变量

    本文链接:https://www.haomeiwen.com/subject/rstzbxtx.html