首页 > 技术文章 > python基础 — 局部变量/全局变量

chen-jun552 2019-11-26 11:39 原文

变量作用区域

变量器作用的额代码范围称为变量的作用与,不同作用区域之间互不影响,函数每部定义的变量一般为局部变量,而不属于任何函数的变量一般为全局变量。所以我们在这里按变量的作用区域分为两类,全局变量和局部变量。

 

局部变量:在某个函数内部定义,作用在函数内部。生命周期:从变量被创建开始到函数结束死亡。
全局变量:定义在.py模块内部,作用在整个.py模块。生命周期:从变量被创造开始到.py模块结束死亡。

案例1:

def Demo1():
    num = 1
    print(num)

Demo1()
print(num)
	
"""
因为num是局部作用,所以在函数外面是找不到num这个变量的,
所以程序会报错:NameError: name 'num' is not defined
"""

  

案例2:

num = 0

def Demo1():
    num = 1
    print("在demo1中的结果:",num)

def Demo2():

    print("在demo2中的结果:",num)

Demo1()
Demo2()

print("在函数外面中的结果:",num)
"""
运行结果为:
在demo1中的结果: 1
在demo2中的结果: 0
在函数外面中的结果: 0
分析:
从结果可以看出,我们在demo1中num = 1,只在demo1内部起作用,而全局变量num仍然是0;因为在python中,在函数内部改变全局变量的值,会默认的在函数内部创建一个新的变量,全局变量并没有改变。要想要改变全局变量的值,需要在函数内部用global声明。

"""
#修改上面如下
num = 0

def Demo1():
    global num
    num = 1
    print("在demo1中的结果:",num)

def Demo2():

    print("在demo2中的结果:",num)

Demo1()
Demo2()

print("在函数外面中的结果:",num)
""'
运行结果为:
在demo1中的结果: 1
在demo2中的结果: 1
在函数外面中的结果: 1
"""

  

 案例3: 还有一种情况是当全局变量是可变数据类形,我们可以通过修改可变数据类型的方法,修改可变类型的内容,从而实现修改全局变量。(这里因为可变数据类型改变时,会在内存中改变数据的值)

num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list.append(4)
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)	

"""
运行结果:
在demo1中的结果: [1, 2, 3, 4]
在demo2中的结果: [1, 2, 3, 4]
在函数外面中的结果: [1, 2, 3, 4]
"""

  

案例4:列表 += 与 + 的区别

+
num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list = demo1_list + [4,5,6]
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)
执行结果:
在demo1中的结果: [1, 2, 3, 4, 5, 6]
在demo2中的结果: [1, 2, 3]
在函数外面中的结果: [1, 2, 3]


+=:
num_list = [1,2,3]

def Demo1(demo1_list):
    demo1_list +=  [4,5,6]
    print("在demo1中的结果:",demo1_list)

def Demo2():

    print("在demo2中的结果:",num_list)

Demo1(num_list)
Demo2()

print("在函数外面中的结果:",num_list)
结果:
在demo1中的结果: [1, 2, 3, 4, 5, 6]
在demo2中的结果: [1, 2, 3, 4, 5, 6]
在函数外面中的结果: [1, 2, 3, 4, 5, 6]  

因为:
对于+号操作,可变对象和不可变对象调用的都是__add__操作

对于+=号操作,可变对象调用__add__,不可变对象调用的是__iadd__(不可变对象没有__iadd__) __iadd__是原地修改。

推荐阅读