京公网安备 11010802034615号
经营许可证编号:京B2-20210330
解析Python中的变量、引用、拷贝和作用域的问题
在Python中,变量是没有类型的,这和以往看到的大部分编辑语言都不一样。在使用变量的时候,不需要提前声明,只需要给这个变量赋值即可。但是,当用变量的时候,必须要给这个变量赋值;如果只写一个变量,而没有赋值,那么Python认为这个变量没有定义。如下:
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
下面我们具体讲一下Python中的变量,引用,拷贝和作用域问题。。
一、可变对象 & 不可变对象
在Python中,对象分为两种:可变对象和不可变对象,不可变对象包括int,float,long,str,tuple等,可变对象包括list,set,dict等。需要注意的是:这里说的不可变指的是值的不可变。对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。另外,不可变的类型可以计算hash值,作为字典的key。可变类型数据对对象操作的时候,不需要再在其他地方申请内存,只需要在此对象后面连续申请(+/-)即可,也就是它的内存地址会保持不变,但区域会变长或者变短。
下面是一些例子:
>>> a = 'xianglong.me'
>>> id(a)
140443303134352
>>> a = '1saying.com'
>>> id(a)
140443303131776
# 重新赋值之后,变量a的内存地址已经变了
# 'xianglong.me'是str类型,不可变,所以赋值操作知识重新创建了str '1saying.com'对象,然后将变量a指向了它
>>> a_list = [1, 2, 3]
>>> id(a_list)
140443302951680
>>> a_list.append(4)
>>> id(a_list)
140443302951680
# list重新赋值之后,变量a_list的内存地址并未改变
# [1, 2, 3]是可变的,append操作只是改变了其value,变量a_list指向没有变
二、变量无类型,对象有类型
三、函数值传递
先看一个例子:
对于上面的输出,不少Python初学者都比较疑惑:第一个例子看起来像是传值,而第二个例子确实传引用。其实,解释这个问题也非常容易,主要是因为可变对象和不可变对象的原因:对于可变对象,对象的操作不会重建对象,而对于不可变对象,每一次操作就重建新的对象。
在函数参数传递的时候,Python其实就是把参数里传入的变量对应的对象的引用依次赋值给对应的函数内部变量。参照上面的例子来说明更容易理解,func_int中的局部变量"a"其实是全部变量"t"所指向对象的另一个引用,由于整数对象是不可变的,所以当func_int对变量"a"进行修改的时候,实际上是将局部变量"a"指向到了整数对象"1"。所以很明显,func_list修改的是一个可变的对象,局部变量"a"和全局变量"t_list"指向的还是同一个对象。
四、浅拷贝 & 深拷贝
接下来的问题是:如果我们一定要复制一个可变对象的副本怎么办?简单的赋值已经证明是不可行的,所以Python提供了copy模块,专门用于复制可变对象。copy中有两个方法:copy()和deepcopy(),前一个是浅拷贝,后一个是深拷贝。浅拷贝仅仅复制了第一个传给它的对象,下面的不管了;而深拷贝则将所有能复制的对象都复制了。下面是一个例子:
五、作用域
在Python程序中创建、改变或查找变量名时,都是在一个保存变量名的地方进行中,那个地方我们称之为命名空间。作用域这个术语也称之为命名空间。具体地说,在代码中变量名被赋值(Python中变量声明即赋值,global 声明的只是变量的使用域)的位置决定了该变量能被访问的范围。函数定义了本地作用域,而模块定义的是全局作用域。
每一个模块都是全局作用域。也就是说,创建于模块文件顶层的变量具有全局作用域,对于外部访问就成了一个模块对象的属性。全局作用域的作用范围仅限于单个文件。“全局”指的是在一个文件的顶层变量名对于这个文件而言是全局的。每次对函数的调用都创建了一个新的本地作用域。Python中也有递归,即可以调用自身,每次调用都会创建五个新的本地命名空间。赋值的变量名除非声明为全局变量,否则均为本地变量。如果需要在函数内部对模块文件顶层的变量名赋值,需要在函数内部通过 global 语句声明该变量。所有的变量可归纳为本地、全局或者内置三种。范围分别为def内部,在一个模块的命名空间内部和预定义的 __builtin__ 模块提供的变量。
变量名引用分为三个作用域进行查找:首先是本地,然后是函数内(如果有的话),之后是全局,最后是内置。在默认情况下,变量名赋值会创建或者改变本地变量。全局声明将会给映射到模块文件内部的作用域的变量名赋值。Python 的变量名解析机制也称为 LEGB 法则,具体如下:
当在函数中使用未确定的变量名时,Python搜索4个作用域:本地作用域(L),之后是上一层嵌套结构中 def 或 lambda 的本地作用域(E),之后是全局作用域(G),最后是内置作用域(B)。按这个查找原则,在第一处找到的地方停止。如果没有找到,Python 会报错的。下图说明了搜索流程(由内及外):
上面说了,Python中的变量是没有类型的,但Python其实是区分类型的:Python的所有变量其实都是指向内存中的对象的一个指针,都是值的引用,而其类型是跟着对象走的。总结来说:在Python中,类型是属于对象的,而不是变量, 变量和对象是分离的,对象是内存中储存数据的实体,变量则是指向对象的指针。在《Learning Python》一书中有一个观点:变量无类型,对象有类型,大概也是说的这个意思。下面是一张说明变量的图:
Python像PHP一样提供了一个global语法,global定义的本地变量会变成其对应全局变量的一个别名,即是同一个变量。下面的例子可以帮你更好的理解:
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
“大学里需要考的证书”这个问题,最容易掉进的坑是把它当成一份标准答案清单。实际上,不存在人人必考的绝对清单。同样是四六级 ...
2026-11-03先说结论:不存在一张适合所有大学生的“含金量最高”证书。同一张证书,对目标岗位是运营的人可能是加分项,对准备考执业资格的 ...
2026-11-03大学毕业能考的证书,先按性质分成五类:职业资格准入类、专业技术资格(职称)类、职业技能等级类、行业与企业认证类、通用能力 ...
2026-11-03专科可以考的证书并不少,但“能报名”和“对求职有用”是两件事。比较稳妥的顺序是:先查当期官方报考简章里的学历、专业、工作 ...
2026-11-03先说结论:中年女性选证书,关键不是找一份“十大高薪证书”榜单,而是先判断自己属于哪一种处境——在职升级、待业转岗,还是育 ...
2026-11-03先把结论说清楚:国内并没有官方发布的“五大含金量最高证书”榜单。网上流传的版本,评选标准往往是薪资、通过率或广告投放,互 ...
2026-11-03手里有一张职业技能等级证书,想确认它是否真实有效,最直接的做法不是在网上搜“证书查询”,而是先确认这张证书由哪类机构发放 ...
2026-11-03“有用且好考”这个搜索词背后,藏着两个容易混淆的判断。很多人把“好考”理解成题目简单,把“有用”理解成拿证就能找到工作, ...
2026-11-03想考证但没方向,最容易踩的坑是打开搜索框直接看“十大含金量证书”,结果越看越乱。更稳妥的顺序是反过来的:先弄清证书按用途 ...
2026-11-03土木工程专业的学生来问证书,通常不是想收集一张清单,而是想弄清一件事:在校这几年,哪些证值得花时间,哪些必须等毕业以后再 ...
2026-11-03“适合大学生考的计算机专业证书”没有通用榜单。想做后端开发、云运维、网络安全或数据分析,该考的证书并不相同;更关键的是, ...
2026-11-03上班族考什么证书比较好,答案不在“含金量排行榜”里,而在你自己的目标岗位上。更实用的做法是:先明确考证要解决什么问题—— ...
2026-11-03“全国认可”这四个字,在证书宣传里出现频率极高,含义却经常被混用。有人把它理解成“国家职业资格”,有人理解成“全国通用、 ...
2026-11-03“女人应该考些什么证”这个问题,很难有一张统一榜单。女性在不同年龄、学历、专业和职业阶段,能报考的证书、需要解决的问题差 ...
2026-11-03“女孩子考什么证书比较吃香”背后往往藏着两层焦虑:证书信息太杂,不知道哪个真有用;又怕被“适合女生”的说法带进窄赛道。先 ...
2026-11-03“含金量高”的证书,从来不是一个统一榜单。同一张证书,对想进医院的人、想进律所的人、想转数据分析的人,价值完全不同。所以 ...
2026-11-03“男的考什么证好找工作”这个问题,真正要解决的不是“哪张证最有用”,而是“你想去的岗位,招人时到底看什么”。证书的价值来 ...
2026-11-03“目前考什么证书比较好且有用”,很难有一份通用榜单。证书的价值不取决于它本身多热门,而取决于你拿它去解决什么问题:让简历 ...
2026-11-03金融专业没有一个“含金量最高”的统一答案。同样是证书,证券从业资格解决的是入行门槛,CPA解决的是执业签字权,CFA对应投研与 ...
2026-11-03直接回答:不是所有证书都值得考,也不是“考得越多越好”。在校期间要不要投入一张证书,先看三件事——目标岗位是否真的需要它 ...
2026-11-03