global修饰符当变量在函数内部时,这个变量是“局部变量”;当变量在函数外部时,这个变量是一个“全局变量”。1、例子:尝试修改全局变量a=10deftest1(a)"cross-function":#我想通过函数a+=20test1(a)把a改成20#执行修改后的函数print(a)#输出:10!修改失败2、为什么修改失败?因为在这个例子中,“全局变量”传递给了“参数”。方法体的操作就是对“形参”的操作。输出的时候输出的是“全局变量”,因为调用函数的时候,函数中的变量会自动销毁。局部变量只能在函数内部访问和修改3.解决方法:globalmodifiera=10deftest2():#globalsolutionfunctionglobala#useglobalmodifiera+=20returnaprint(test2())#output:30!修改成功,使用global修饰符时,解释器会使用“局部变量块”中的“全局变量”4.全局bug:保证全局变量的唯一性deftest1(b):a=9999globalaa+=20returna#SyntaxError:#name'a'assignedtobeforeglobaldeclaration#globalvariablescannotberepeatedwithlocalvariablesdeftest1(a):globalaa+=20returna#SyntaxError:#name'a'是参数和global#global变量不能和形参重复#global不能放在for变量类型/不可变类型の修饰变量类型:list,dictionary,set不可变类型:number,string,tuple这些类型都是对象。在Python中,这些对象被明确定义:哪些可以修改,哪些不能。这会创建可变和不可变类型。引用&实际内存在一个赋值语句中:a=1,a是引用,1是实际内存空间,a指向1。所有数据类型的赋值都是这样的内存表示。变量类型:内存共享为什么说“列表、字典、集合”是变量类型?那是因为可变类型的内存是可共享的:可以被多个引用(变量)指向。list=[1,2,3,4,5]defmodify(l_ist):l_ist+=[6,7]print("我修改形参,结果:",list)li_st=list#让局部变量li_st指向列表li_st+=[8,9,10]print("我操作局部变量修改,结果",list)modify(list)print("最后,我将输出全局变量,结果",list)!#我操作形参修改,结果:[1,2,3,4,5,6,7]#我操作局部变量修改,结果[1,2,3,4,5,6,7,8,9,10]#最后我又输出了全局变量,结果是[1,2,3,4,5,6,7,8,9,10]虽然是全局变量列表,形参l_ist和局部变量li_st是不同的(栈内存)变量,但它们都指向实际的内存空间:[1,2,3,4,5]。实际内存空间由三个指针(引用)共享!因此,对任何引用的任何计算操作都可以改变实际空间!不可变类型:内存不能共享a=10defmodify2(a):a+=10print(a)所以a+=10只是对形参的操作。形式参数和全局变量没有关系,所以不会互相影响。变量类型修改bug:修改无效list=[1,3,5,7,9]defmodify3(list):#modifylistlist=[2,4,6,8,10]print(list)#modifyInvalid#输出:[1,3,5,7,9],修改失败因为:形参列表指向[1,3,5,7,9]局部变量列表指向[2,4,6,8,10](新建内存空间)注意形式参数和局部变量不是一回事!虽然同名,但是指向不同的内存空间!如何使用局部变量访问和修改全局列表?(提示:修改指针)修改指针的思路是正确的,但是由于局部变量在函数调用结束时被销毁,所以即使修改了指针也是无效的。总结一下不可变类型的修改,因为内存是不共享的(不能共享引用),所以不能在localblock中修改。只有全局修饰符可以用来修饰变量类型的修饰。因为内存是共享的(可以共享多个引用),所以可以在任意局部修改,也可以通过全局修饰符递归修改defjiec(i):ifi==1:return1returni*jiec(i-1)理解递归代码的要点:1.函数入口(层)2.函数出口(返回值)匿名函数匿名函数就是没有名字的函数。参数和返回值对于一个函数来说是必须的。匿名函数最大限度地简化了这两个必需品的语法。sum=lambdaa,b:a+b'''lambda:匿名函数声明标记参数:以逗号分隔返回值:以冒号开头'''匿名函数应用排序函数stus=[{"name":"zhangsan""age":22},{"name":"lisi","age":21},{"name":"wangwu","age":19}]stus.sort(key=lambdai:i["age"])排序函数有一个参数:key。形式参数键是一个函数。集合的所有元素sorted()都会执行key函数。键的作用是什么?关键是指定要排序的内容。如果我们想按年龄排序,就得想办法把年龄的值赋值给key。这里用到了匿名函数stus.sort(key=lambdai:i["age"])#形参是i,是一个字典元素#返回值是i["age"],是agekey每个字典元素值
