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

一、局部变量

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

下面来举例说明局部变量的使用及其需要注意的地方。

1、

 1 def func1():
 2     a=100
 3     print("a的值为:%s"%a)
 4 def func2():
 5     b=100
 6     b+=100
 7     print("b的值为:%s"%b)
 8 
 9 func1()
10 func2()

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

局部变量的小结:

1、局部变量,就是在函数内部定义的变量

2、不同的函数,可以定义相同的名字的局部变量,但是各用个的不会产生影响

3、局部变量的作用,为了临时保存数据需要在函数中定义变量来进行存储,这就是它的作用

二、全局变量

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

下面来举例说明。

1、

 1 c=100
 2 def func3():
 3     print("c的值为:%s"%c)
 4     d=200
 5     sum=c+d
 6     print("sum的值为:%s"%sum)
 7 def func4():
 8     print("c的值为:%s"%c)
 9     square=c**2
10     print("square等于:%s"%square)
11 
12 func3()
13 func4()

输出结果为:

1 c的值为:100
2 sum的值为:300
3 c的值为:100
4 square等于:10000
5 [Finished in 0.2s]

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

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

 1 a=400#全局变量,可以在后面的代码中使用。
 2 def test1():
 3     a=200#局部变量只能在该函数中使用(它的作用范围在该函数里面)
 4      
 5     a+=1
 6     print("a的值为%s"%a)
 7     return a
 8  
 9 def test2(a):
10     #a=300#如果函数的局部变量和全局变量的名字一样,优先使用局部变量
11  
12     print("test2函数中a的值为:%s"%a)
13 b = test1()
14  
15 test2(b)
16 print(a)

输出结果为:

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

仔细看看上面的例子。

3、修改全局变量

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

答案是使用:global

举例如下:

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

输出结果为:

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

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

1、如果是可变类型可以执行修改变量的值,

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

到此,对于全局变量做一个小结:

A、在函数外边定义的变量叫做全局变量

B、全局变量能够在所有的函数中进行访问

C、如果在函数中修改全局变量,那么就需要使用global进行声明,否则出错

D、如果全局变量的名字和局部变量的名字相同,那么使用的是局部变量的,小技巧强龙不压地头蛇

 

以上就是关于全局变量和局部变量的所有问题以及需要注意的点。在这里我们在做一个总结。

  • 在函数中不使用global声明全局变量时不能修改全局变量的本质是不能修改全局变量的指向,即不能将全局变量指向新的数据。

  • 对于不可变类型的全局变量来说,因其指向的数据不能修改,所以不使用global时无法修改全局变量。

  • 对于可变类型的全局变量来说,因其指向的数据可以修改,所以不使用global时也可修改全局变量。

可变类型:值可以修改(内存地址不变但是所保存的值变化了),引用可以修改(变量的内存地址变化了)

不可变类型:值不可以修改,可以修改变量的引用(=赋值号)。

在函数里面修改全局变量:

     1、如果全局变量是可变类型:所以在函数里面任意修改(值,引用)

     2、如果全局变量是不可变类型:在函数里面不能修改值,也不能修改引用,除非加上global 才能修改引用。

思考:全局变量可以放在哪里?

        全局变量放在调用函数之前。

posted @ 2017-11-02 21:04  天意凉  阅读(8311)  评论(0编辑  收藏  举报