day3-作用域、局部和全局变量

背景

我们在写代码时,都要声明变量,但是我们可曾想过变量的作用范围?今天我们就来说一下变量的作用域。首先我们根据变量的作用范围把变量分为:

  • 局部变量
  • 全局变量

定义

1.局部变量

说明:指在局部生效,定义在函数体内的变量,只能在函数里面生效,出了这个函数体,就不能找到它,这个函数就是这个变量的作用域。

示例代码如下:

def change_name(name):
    print("before change:",name)
    name="HU WEI"   #定义在函数体内=>局部变量
    print("after change:",name)

name="hu wei"
change_name(name)
print(name)
#输出
before change: hu wei
after change: HU WEI  #局部变量=》只在函数体内生效
hu wei

解析:在函数体内的局部变量,也就是说这个函数就是这个变量的作用域。出了这个函数,就找不到这个变量了。

2.全局变量

说明:指的是在整个程序中都生效的变量,在整个代码的顶层定义。

代码如下:

school = "SuZhou University"  #定义全局变量

def change_name(name):
    school="Nanjing University"   #定义局部变量
    print("before change:",name,school)  
    name="HU WEI"
    print("after change:",name)

name="hu wei"
change_name(name)
print(name,school) 
#输出
before change: hu wei Nanjing University  #打印局部变量
after change: HU WEI
hu wei SuZhou University  #打印全局变量

解析:可以看出,变量的优先级是局部变量高于全局变量的,当函数体内没有局部变量,才会去找全局变量。但是如果我想在函数体内修改全局变量,应该如何做呢?

一、函数里面修改全局变量

1.在函数体内使用关键字global声明一下全局变量

2.在函数体内将全局变量名重新赋值

school = "SuZhou University"  #定义全局变量

def change_name(name):
    global school   #使用global声明全局变量
    school = "Nanjing University"   #将全局变量重新赋值
    print("before change:",name,school)
    name="HU WEI"
    print("after change:",name)

name="hu wei"
change_name(name)
print(name,school)

#输出
before change: hu wei Nanjing University
after change: HU WEI
hu wei Nanjing University   #打印被强制修改后的全局变量

二、只在函数里面声明全局变量

def change_name(name):
    global school        #global关键字定义全局变量
    school = "Nanjing University"
    print("before change:",name,school)
    name="HU WEI"
    print("after change:",name)

name="hu wei"
change_name(name)
print(name,school)

#输出
before change: hu wei Nanjing University
after change: HU WEI
hu wei Nanjing University   #打印全局变量

注意:对于以上只在函数体内定义全局变量,我们不建议这么做,因为在整个程序中全局变量有可能用于多个函数,这样会导致程序出现问题。

三、可修改列表,字典,集合,类(class)

name =["huwei","yangguang","hujiayang"]   #定义一个列表

def change_name(name):
    global school
    print("before change:",name)
    name[0]="huw22"
    print("after change:",name)

change_name(name)
print(name)

#输出 
before change: ['huwei', 'yangguang', 'hujiayang']
after change: ['huw22', 'yangguang', 'hujiayang']  #打印函数内修改后的全局变量
['huw22', 'yangguang', 'hujiayang']    #打印函数外修改后的全局变量

注:除了以上,在函数体内不能修改全局的字符串整数

总结:

1.在子程序(函数)中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量;

2.全局变量的作用域是整个程序,局部变量的作用域是定义该变量的函数体内;

3.当全局变量和局部变量同名时:在定义局部变量的函数体内,局部变量起作用;在其他地方,全局变量起作用。

 

posted @ 2017-07-31 21:52  Mr.hu  阅读(107)  评论(0)    收藏  举报