Python学习(五)
一、变量VS引用
1、变量的引用
(1)、Python中变量和数据是分开保存的
(2)、变量中保存的是变量的地址,成为引用
(3)、使用id()函数可以查看白能量中保存数据所在的内存地址
例子:
a = 1
print(id(a))
b = a
print(id(b))
结果:
2、函数的参数和返回值
在Python中函数的参数和返回值传递的都是引用:
def test(a):
print("a的地址是:%d" % id(a))
result = 2
print("result的地址是:%d" % id(result))
return result
b = 1
print("b的地址是:%d"%id(b))
ans = test(b)
print("ans的地址是:%d" % id(ans))
结果:
二、全局变量
1、可变和不可变
(1)、不可变类型:内存中的数据不允许被修改:
数字类型:int,float,bool,complex
字符串:str
元组:tuple
(2)、可变类型,内存中的数据可以被修改:
列表:list
字典:dire
注意:赋值语句只是改变了变量引用的对象,并没有改变内存中的具体的值,例如:
a = 1
print(a)
a = "hello"
print(a)
a = [1,2,3]
print(a)
变量和值在内存中的分布:
(1)、可变类型的数据变化,是通过方法实现的
(2)、如果给一个可变类型的变量,复制一个新的数据,引用会修改,变量不再对之前数据的引用,变量改为对新复赋值数据的引用
注意:
在字典中,key只能是不可变的类型(int,float,str,bool,元组等),不可以为列表和字典,这是因为Python中将字典的key哈希为唯一的值方便对字典的值进行增、删、改、查。
python中hash函数:
接收一个不可变类型的数据作为参数,返回结果是一个整数,只要内容相同,返回的结果就是相同的。
2、全局变量和局部变量
划分:
在函数内部定义的为局部变量,只能在函数内部使用
在函数外部定义的为全局变量,所有函数内部都可以使用
局部变量的生命周期:
生命周期就是变量从被创建到被系统回收的过程
局部变量在函数执行时才会被创建
函数执行结束后局部变量被系统回收
局部变量在生命周期内,可以用来存储函数内部临时使用的数据
函数执行时,处理变量的顺序:
首先查找函数内部,之后是全局,如果都没有那么报错
关于全局变量的注意点:
(1)、函数内部不能直接修改全局变量
num = 1
def fun():
num += 1
print(num)
fun()
结果:上述的代码会报错,num没有定义。
修改:如果需要改变全局变量,使用global进行声明:
num = 1
def fun():
global num
num += 1
print(num)
fun()
print(num)
#结果:
#2
#2
(2)、如果直接在函数中对全局变量赋值,没有使用global的话,就会生成一个与全局变量同名的局部变量:
num = 1
def fun():
num = 2
print(num)
fun()
print(num)
#输出:
#2
#1
分析:
上述的代码执行,会在函数的内部生成一个局部变量num。
(3)、全局变量的申明建议:
在全局函数的前面,建议以g_或者egl_开头。
三、函数返回值
函数返回值
返回多个值:
使用元组,语法:
def func():
a = 1
b = 2
return (a,b)
#括号可以省略
#return a,b
接收为元组的返回值:
res = func()
print(res[0])
print(res[1])
#或者
gl_res1,gl_re2 = func()
函数返回元组的应用:
交换两个数的值:
(1)、使用中间变量
(2)、算数方法
#使用异或
a = 1
b = 2
a = a^b
b = a^b
a = a^b
print(a)
print(b)
#使用加减法
a = 1
b = 2
a = a+b
b = a-b
a = a-b
(3)、Python特有的方法,使用元组
a = 1
b = 2
a,b = (b,a)
#或者括号可以省略
a,b = b,a
四、函数参数
1、函数参数值的改变
当将全局变量作为参数传入函数中,在函数中对参数进行操作是否会影响全局变量,要根据变量本身的类型和采取什么操作来判定:
(1)、传入的不可变的变量(int,float,bool,tuple,str等),不会影响
(2)、传入可变的变量例如列表和字典,并且进行的是赋值操作,那么也不会影响
(3)、传入的是可变的变量,但是使用的是这些变量的方法,会影响
例子:
def demo(num,list1,list2):
num += 1
list1 = list1+list1
list2.append(num)
print(num)
print(list1)
print(list2)
num = 1
li1 = [2,3,4]
li2 = [2,3,4]
demo(num,li1,li2)
print(num,li1,li2)
结果:
分析:从变量在内存中是可变变量和不可变变量,引用的改变来判断。
注意:在对列表使用+=操作的时候实际上调用的是extend()方法,不等于list = list+list.
def demo(list1):
list1+=list1
print(list1)
li = [1,2,3,4]
demo(li)
print(li)
2、参数缺省
有多个缺省参数时候,如果要传入参数,那么要指明具体的参数。
def show_info(name,class_id="1班",gender=True):
"""
显示输出姓名,班级和性别信息
"""
sex = "男生"
if not gender:
sex = "女生"
print("%s是%s的%s"%(name,class_id,sex))
show_info("zhangsan")
show_info("lisi",class_id="2班")
show_info("wangfang",gender=False)
结果:
注意:有默认值的参数只能在最后定义。
3、多值参数
参数前有一个*代表的是参数是列表,有两个*代表的是字典:
def demo(*args,**kwargs):
print(args)
print(kwargs)
demo(1,2,3,4,name="小明",age=19)
#实现不定值的累加
def sum(*args):
res = 0
for num in args:
res += num
print(res)
sum(1,2,3,4,5)
结果:
拆包:当我们直接将列表和字典传入多值参数的函数的时候要使用拆包,列表使用一个星,字典使用两个星:
def demo(*args,**kwargs):
print(args)
print(kwargs)
a = [1,2,3,4]
b = {"name":"xiaoming","age":10}
demo(a,b)
demo(*a,**b)
注意:如果不适用拆包,就会将所有的参数看成列表的内容。
啊!肖战!!!!!!