【Python教程】十六、变量真的是变量名+变量值吗?变量的本质

更多教程请私信~

来源:思路实验室 

作者:室长

大家好,欢迎收看思路实验室出品的Python入门教程,我是室长。

我们学习了这么多期,相信大家也对Python有了一些了解。但其实有些概念介绍得比较简单,这是为了快速地建立起对概念的认识,快速地能上手使用。当有了认识,能够使用后,我们还应该回过头来仔细看一看这个概念认识得准不准确。

在我们之前的介绍中,变量是由变量名和变量值组成的,这种关系非常像是字典的键值对一样,一一对应。同时不同的变量名可以对应同样的值,而同样的变量名不能对应不同的值。新的变量值会覆盖掉旧的值。

这样理解在很多情况下是没问题的,但有时候就不灵了,我们举个例子:

这时候可以想见,打印的结果是1,对吧!

如果我们在b=a后把a的值赋为2,那b的值会是多少?

b=a实际上是把a的值赋给了b,而不是把变量名赋给了b。现在我们只给a重新赋了值,所以b是不受影响的:

这个思路看起来没有什么问题。如果我们换成列表呢?

看起来也挺正常的。那如果我们使用一下列表方法呢?

怎么一下子就不一样了?明明是往a列表里添加元素,为什么b列表也跟着加了?说好的不受影响呢!

这就涉及变量的本质问题了,也就是说,变量到底是什么,它是怎么产生的,又连接了什么东西?

我们之前说过,在Python中,万物皆对象。整数是对象,列表也是对象。所以变量名指向的是对象。在刚才给a和b赋值为整数时,a就指向了整数对象1,而b=a则是让b指向了a所指向的对象,同样是1。后边我们将a重新指向整数对象2,但没有让b的指向发生变化,所以b的值仍然是1。

为什么不是将a指向的整数对象的值改为2?因为整数对象是不可修改的。“不可修改”的概念我们在学习字符串时给大家介绍过,另外我们应该还记得元祖也是不可修改的。

而到了列表就不一样了,我们先让a指向一个包含一个元素1的列表对象,再让b指向a指向的列表(即[1])。而当这个列表被添加了一个元素2的时候,对于每个指向它的变量,打印出来都是[1,2]。

那为什么给a重新赋值为[2],b不受影响呢?因为[2]本身是另一个列表了,给a赋值为[2]就让a指向了另一个对象,之前的[1]就和a say goodbye了。

事实上,变量是怎么赋值的呢?这个过程有点像工厂招人分配宿舍:

不管是什么类型的数据,都是储存在于内存中的。内存之于数据,就像宿舍之于住户。工地宿舍,从来都是现用人现招人,招来之后分好宿舍再去分配岗位。工人被分配的宿舍号,被称为内存地址。分配完了,工头就安排了,这个宿舍的人去干啥,那个宿舍的人去干啥。后来为了省事,直接在宿舍门上贴上分配好的岗位,而这个岗位名,就被称为变量。

所以Python中的变量,实际上是变量名与内存地址之间的对应关系。

理解了这些,我们终于知道为什么对a使用列表方法会影响到b。

室长在刚开始学习Python的时候没少在这个问题上吃过亏,命名就想要复制一个列表,结果在别的过程中被改来改去。那么如果我单纯想获得一个列表的复制,该怎么去操作呢?请关注下期:在Python里搞克隆|浅拷贝与深拷贝

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值