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)

在这里插入图片描述注意:如果不适用拆包,就会将所有的参数看成列表的内容。

啊!肖战!!!!!!
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值