目录

函数传递引用与直接操纵全局变量消耗资源的区别

函数传递引用与直接操纵全局变量消耗资源的区别有:1、时间和空间开销不同;2、函数调用开销不同;3、内存访问开销不同。时间和空间开销不同是指函数传递引用方式需要进行额外的参数传递操作,会带来一定的时间和空间开销。

一、函数传递引用与直接操纵全局变量消耗资源的区别

当我们需要在函数内部修改全局变量的值时,有两种方法可以实现:名列前茅种是通过将全局变量作为参数传递给函数,并使用引用来操作和修改其值;第二种方法是直接在函数内部操纵全局变量。这两种方法在消耗资源方面有所不同:

1、时间和空间开销不同

函数传递引用方式需要进行额外的参数传递操作,这可能会带来一定的时间和空间开销。而直接操纵全局变量则不需要经过任何参数传递操作。

2、函数调用开销不同

在使用函数传递引用方式时,由于需要进行参数传递操作,所以会产生一定的函数调用开销,包括函数调用前的准备工作、函数调用后的清理工作以及实际的函数调用过程。而直接操纵全局变量时,则不需要进行任何函数调用操作。

3、内存访问开销不同

在使用函数传递引用方式时,由于需要访问堆栈中的相对地址,所以可能会产生额外的内存访问开销。而直接操纵全局变量则可以直接访问全局变量,不需要访问堆栈中的相对地址。

二、全局变量与局部变量的使用问题

1、局部变量

局部变量也称为内部(函数内部)变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内, 离开该函数后再使用这种变量是非法的。对于整个程序而言,局部变量仅在其定义的函数内部起作用,因此称为局部变量。其作用域是所定义的函数内部,从它们的名称被定义的那一点开始。

代码示例:

def func1():
    a=100
    print("a的值为:%s"%a)
def func2():
    b=100
    b+=100
    print("b的值为:%s"%b)

func1()
func2()

上面的变量a和b都是局部变量,其中a的作用域是函数func1(),b的作用域是函数func2()。如果在func1()中调用b,或者在func2中调用a,都会出现NameError: name ‘b’ is not defined这样的错误。

局部变量的小结:

  • 局部变量,就是在函数内部定义的变量。
  • 不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响。
  • 局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用。

2、全局变量

全局变量也称为外部变量,它是在函数外部定义的变量。 它不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序。在函数中使用全局变量,一般应作全局变量说明。 只有在函数内经过说明的全局变量才能使用。 但在一个函数之前定义的全局变量,在该函数内使用可不再加以说明。

代码示例:

c=100
def func3():
    print("c的值为:%s"%c)
    d=200
    sum=c+d
    print("sum的值为:%s"%sum)
def func4():
    print("c的值为:%s"%c)
    square=c**2
    print("square等于:%s"%square)

func3()
func4()

输出结果:

c的值为:100
sum的值为:300
c的值为:100
square等于:10000
[Finished in 0.2s]

上面例子中的c就是一个全局变量。变量c在函数外部定义,在同一程序中可以被所有函数使用。在全局变量c定义之后的函数都可以直接调用,不需附加任何代码。所以全局变量一般定义在函数的前面。

3、全局变量和局部变量名字相同的问题

代码示例:

a=400#全局变量,可以在后面的代码中使用。
def test1():
    a=200#局部变量只能在该函数中使用(它的作用范围在该函数里面)

    a+=1
    print("a的值为%s"%a)
    return a

def test2(a):
    #a=300#如果函数的局部变量和全局变量的名字一样,优先使用局部变量

    print("test2函数中a的值为:%s"%a)
b = test1()

test2(b)
print(a)

输出结果:

a的值为201
test2函数中a的值为:201
400
[Finished in 0.2s]

4、修改全局变量

既然全局变量可以在函数中被使用,那么如何修改全局变量呢?

答案是:使用global

代码示例:

student={"name":"laowang"}
a="laogao"
b=100
#在函数中修改全局变量:1、如果是可变类型可以执行修改变量的值,2、如果全局变量是不可变类型,如果想要在函数中修改不可变类型,  其实本质上是修改不可变类型的全局变量的引用,加上global 就可以修改不可变变量的引用。
def test1():
    print("原始的全局变量为:%s"%names)
    names[2]="laoxiao"
    student["age"]=23
    #a="golbin"#定义一个局部变量
    global a
    a="golbin"#修改全局变量
    global b
    b+=1
names=["laowang","lisi",'zhangsan']#全局变量定义在调用函数之前
test1()
print("最后的全局变量为:%s"%names)
print("最后的全局变量为student:%s"%student)
print("最后的全局变量a的值为:%s"%a)
print("最后的全局变量b的值为:%s"%b)

输出结果:

原始的全局变量为:['laowang', 'lisi', 'zhangsan']
最后的全局变量为:['laowang', 'lisi', 'laoxiao']
最后的全局变量为student:{'name': 'laowang', 'age': 23}
最后的全局变量a的值为:golbin
最后的全局变量b的值为:101
[Finished in 0.2s]

注意,在函数中修改全局变量:

  • 如果是可变类型可以执行修改变量的值;
  • 如果全局变量是不可变类型,如果想要在函数中修改不可变类型,其实本质上是修改不可变类型的全局变量的引用,加上global 就可以修改不可变变量的引用。

延伸阅读1:什么是变量

变量从字面意思可以理解成:是变化的量。

  • :记录现实世界中的状态,让计算机能够像人一样去识别世间万物。
  • :现实世界中的状态是会发生改变的。
一站式研发项目管理平台 PingCode

一站式研发项目管理平台 PingCode

支持敏捷\瀑布、知识库、迭代计划&跟踪、需求、缺陷、测试管理,同时满足非研发团队的流程规划、项目管理和在线办公需要。