python中变量的引用、可变和不可变类型、局部变量和全局变量变量的引用
变量和数据都是保存在内存中的
变量和数据是分开存储的
数据保存在内存中某个位置,通过地址来标记
变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置
把变量保存数据地址的过程称为引用
变量的重新赋值修改的是变量中引用数据的内存地址
变量之间的赋值实际是引用的传递
函数参数的传递,本质也是引用的传递
函数的返回值本身也是引用的传递
可变和不可变类型
不可变类型,内存中的数据不允许被修改:数字类型(int,bool,float,complex,long(2,x)、字符串、元组(tuple)
可变类型,内存中的数据可以被修改:列表list、字典dict
无论是可变还是不可变数据类型 , 通过赋值语句 , 都会改变变量的引用
Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型
局部变量
1.在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部)
2.在函数外部无法直接访问局部变量
3.不同的函数中可以定义同名的局部变量
4.局部变量的生命周期:从定义变量时开始 , 到函数运行结束
全局变量
1.在所有函数外边定义的变量就是全局变量
2.让所有函数都能访问到,可以作为函数通信的桥梁
3.一般情况下,为了和普通变量的区别 , 需要加上g_或gl_前缀
4.全局变量一般放在所有函数的最上面
5.在函数内部修改全局变量 , 必须要加上global关键字,如果不加global只是定义了一个同名的局部变量
函数的多个返回值
python中值传递还是引用传递?首先,Python中一切事物皆对象,变量是对对象在内存中的存储和地址的抽象 。所有的变量都可以理解是内存中一个对象的“引用”,或者,也可以看似c中void*的感觉 。
python中统一都是引用传递,同时要注意类型是属于对象的,而不是变量 。而对象有两种,“可更改”(mutable)与“不可更改”(immutable)对象 。在python中,strings, tuples, 和numbers是不可更改的对象 , 而list,dict等则是可以修改的对象 。
当我们写下面语句时:
Python解释器其实顺序干了两件事情:
从这里可以看出strings类型是不可变量,不可变实际上指的是不会更该字符串,比如把a = '123' 变为 a ='1234' 实际上是先创建了 “1234” 再用a去指向它 。
但是,像list,dict等“可更改”的变量,他们会直接再本地更改,不会进行副本拷贝 。
简言之,当在 Python 中 a = sth 应该理解为给 sth 贴上了一个标签 a 。当再赋值给 a 的时候,就好象把 a 这个标签从原来的 sth 上拿下来 , 贴到其他对象上,建立新的"引用" 。
既然Python只允许引用传递,那有没有办法可以让两个变量不再指向同一内存地址呢?
copy对于一个复杂对象的子对象并不会完全复制,什么是复杂对象的子对象呢?就比如序列里的嵌套序列,字典里的嵌套序列等都是复杂对象的子对象 。对于子对象,python会把它当作一个公共镜像存储起来,所有对他的复制都被当成一个引用,所以说当其中一个引用将镜像改变了之后另一个引用使用镜像的时候镜像已经被改变了 。
deepcopy的时候会将复杂对象的每一层复制一个单独的个体出来 。当然其中主要的操作还是地址问题 。
当一个引用传递给函数的时候,函数自动复制一份引用,这个函数里的引用和外边的引用没有半毛关系了.所以第一个例子里函数把引用指向了一个不可变对象,当函数返回的时候,外面的引用没半毛感觉.而第二个例子就不一样了,函数内的引用指向的是可变对象,对它的操作就和定位了指针地址一样,在内存里进行修改.
推荐阅读
- 1vs1的恋爱游戏,恋爱游戏类小说
- 如何看待新媒体资讯,如何看待新媒体资讯问题
- 公众号限定文章字数,公众号文章字数上限
- 提子直播素材下载,提子在线
- 关于python函数实现替换的信息
- 结婚拍摄什么环节,结婚拍摄风格有几种
- mongodb什么时候上线,mongodb最新版本
- 未入网的电视为什么台数少,没网电视
- c语言case调用函数 c语言case表达式