变量作用区域
变量器作用的额代码范围称为变量的作用与,不同作用区域之间互不影响,函数每部定义的变量一般为局部变量,而不属于任何函数的变量一般为全局变量。所以我们在这里按变量的作用区域分为两类,全局变量和局部变量。
局部变量:在某个函数内部定义,作用在函数内部。生命周期:从变量被创建开始到函数结束死亡。
全局变量:定义在.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__是原地修改。