1、变量的引用
在python中,变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存着数据在内存中的位置
变量中记录数据的地址,就叫做引用
使用id()函数可以查看变量中保存数据所在的内存地址
注:如果变量已经被定义,当给一个变量赋值的时候,本质上是修改了数据的引用
变量不再对之前的数据引用
变量改为对新赋值的数据引用
def test(num): print("在函数内部%d对应的内存地址是%d"%(num,id(num))) a=10 #数据的地址本质上是一个数字 print("a变量保存数据的内存地址是%d"%id(a)) #2、调用test函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据 test(a)
def test(num): print("在函数内部%d对应的内存地址是%d"%(num,id(num))) #1、定义一个字符变量 result="hello" print("函数要返回数据的内存地址是%d"%id(result)) #2、将字符串变量返回,返回的是数据的引用,而不是数据本身 return result a=10 #数据的地址本质上是一个数字 print("a变量保存数据的内存地址是%d"%id(a)) #2、调用test函数,本质上传递的是实参保存数据的引用,而不是实参保存的数据 #注意:如果函数有返回值,但是没有定义变量接收 #程序不会报错,但是无法获得返回结果 r=test(a) print("%s的内存地址是%d"%(r,id(r)))
2、可变和不可变数据
不可变数据:数字类型、字符串、元组
可变类型:列表、字典
#列表 a=[1,2,3] print(id(a)) a.append(999) print(a) print(id(a)) a.remove(2) print(a) print(id(a)) a.clear() print(a) print(id(a)) a=[] print(id(a)) #字典 d={"name":"xiaoming"} d["age"]=18 print(d) print(id(d)) d.pop("age") print(d) print(id(d)) d.clear() print(d) print(id(d)) d={} print(d) print(id(d))
1、可变类型的数据变化,是通过方法来是实现的
2、如果给一个可变类型的数据,赋值了一个新的数据,引用会修改,
变量不再对之前的数据引用;变量改为对新赋值的数据引用
键值对的key必须是可变类型数据;键值对的value可以是任意类型的数据
3、局部变量和全局变量
#局部变量是在函数内部定义的变量,只能在函数内部使用; # 全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量 #在其他开发语言中,大多不推荐使用全局变量——可变范围太大,导致程序不好维护 def demo1(): # 定义一个局部变量 #出生:执行了下方的代码之后,才会被创建 #死亡:函数执行完成之后 num=10 print("在demo1函数内部的变量是%d"%num) def demo2(): # print("%d"%num) pass demo1() demo2() def demo1(): num=10 print("在demo1函数内部的变量是%d"%num) def demo2(): num = 99 print("在demo2函数内部的变量是%d" % num) demo1() demo2() #在不同的函数,可以定义相同名字的局部变量,但是彼此之间不会产生影响 num=10 def demo1(): print("在demo1函数内部的变量是%d"%num) def demo2(): print("在demo2函数内部的变量是%d"%num) demo1() demo2()
#在函数内部直接修改全局变量的值 num=10 def demo1(): #希望修改全局变量的值,使用global声明一下变量即可 #golbal关键字会告诉解释器,后面的变量是一个全局变量 #再使用赋值语句时,就不会创建局部变量 global num num=99 print("在demo1函数内部的变量是%d"%num) def demo2(): print("在demo2函数内部的变量是%d"%num) demo1() demo2()