目录
1、变量的引用
变量和数据都保存在内存中。
python中函数的参数传递以及返回值都是靠引用传递。
1.1引用
变量和数据是分开存储的
数据保存在内存中的一个位置
变量中保存着数据在内存中的地址
变量中记录数据的地址,就叫做引用
id()函数可以查看变量中保存数据的内存地址
注意:变量已经被定义,当给一个变量赋值时,本质是改变数据的引用(变量不再对之前的数据引用,改为对新赋值引用)
1.2函数的参数和返回值的传递
def demo(num):
print("%d在函数内的内存地址是%x" % (num, id(num)))
result = 100
print("返回值%d在函数中的内存地址是%x" % (result, id(result)))
return result
a = 10
print("函数调用前内存地址是%x" % id(a))
r = demo(a)
print("函数调用后实参内存地址是%x" % id(a))
print("函数调用后返回值的内存地址%x" % id(r))
2、可变和不可变数据类型
不可变数据类型(内存中的数据不允许被修改):
数字类型:int,bool,float,complex
字符串 str
元组 tuple
可变数据类型(内存中的数据可以被修改):
列表:list
字典:dict
注意:字典中的键只能是不可变数据类型
可变数据类型的改变是通过方法
如果给可变数据类型赋一个新值,引用会修改
哈希(hash)
hash()函数接收一个不可变数据类型作为参数,返回一个整数
在python中,设置字典键值对,会首先对字典的键进行hash,决定如何在内存中保存字典的数据,以方便后续对字典的增,删,改,查
3,局部变量和全局变量
局部变量是在函数内部定义的变量,只能在函数内部使用。函数执行结束后,函数内部的局部变量会被系统回收,不同函数可以定义相同名字的局部变量,彼此之间不会有影响。
局部变量的生命周期:
局部变量在函数执行的时候才会被创建,函数执行结束被系统回收,局部变量在生命周期内,可以用来存储函数内部临时使用到的数据。
全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量。
注意:函数执行时,需要处理变量会首先在函数内部查找是都存在执行名称的局部变量,如果有,直接使用,如果没有,在函数外部查找是否存在指定名称的全局变量,如果有,直接使用,如果没有,报错。
1.函数不能直接修改全局变量的引用
全局变量是在函数外部定义的变量,所有函数内部都可以使用这个变量
提示:在其他开发语言中,大多不推荐使用全局变量--可变范围太大,导致程序不好维护
在函数内部,可以通过全局变量的引用获取对应的数据
但是,不允许直接修改全局变量的引用--使用赋值语句修改全局变量的值
注意:在函数内部对全局变量进行赋值,只是新定义一个与全局变量变量名相同的局部变量,如果需要修改全局变量,需要使用global关键字进行声明
def demo01():
num = 100
print("num=%d id(num)=%d" % (num, id(num)))
return num
# 调用函数 在函数的外部不能直接访问局部变量
# print(num)
ret = demo01()
# 全局变量 在函数外面定义的变量就是全局变量
# 作用:所有函数都能访问,作为函数通信的桥梁,一般放在最前面
# 一般情况,为了区分全局变量和一般变量,需要加上g_或者gl_前缀
g_num = 200
print("g_num:%d, id(g_num):%d" % (g_num, id(g_num)))
def demo02():
# 注意:在函数内部修改全局变量,必须加上global关键字
# global关键字就是告诉python解释器,我修改的是全局变量
global g_num
g_num = 300
print("demo02:%d, id(demo02):%d" % (g_num, id(g_num)))
def demo03():
print("demo02:%d, id(demo02):%d" % (g_num, id(g_num)))
demo02()
demo03()
全局变量定义的位置:为了保证所有函数都能正确使用全局变量,应该将全局变量定义在其他函数的上方。
全局变量命名建议:为了避免全局变量和局部变量混淆,在进行全局变量定义时,全局变量前面增加g_或者gl_的前缀