c++变量重新赋值_关于Python的变量,我就说一句话

2505c738e829c3b8e72c1dcd5fe37729.png

在多年开发和教学 Python 的过程中,有一个 bug,出现的频率非常高,经常有人会踩坑:

person 

你觉得输出结果是什么(单选):

  1. {'name': 'Jack', 'id': 0}
  2. {'name': 'Pony', 'id': 1}
  3. {'name': 'Crossin', 'id': 2}
  4. {'name': 'Pony', 'id': 2}
  5. {'name': 'Crossin', 'id': 1}

在电脑上执行下,看看和你想的是否一样?

一种很常见的错误,就是觉得 team 这里列表(list)里是三个独立的字典(dict)对象。然而看了输出你就会发现,列表中的三个元素长得一样。而且,如果你之后再更改任何一个的 name 或 id 属性,另外两个也会跟着变。

为什么会这样?

这个问题,就是我今天要说的话:在 Python 中,你要把变量想象成一个标签,而不是一个容器

什么意思?在某些语言中,变量确实像一个“容器”,你定义了某种类型的变量,就给你分配好这个容器,之后你给变量赋值,就像是往容器里装入不同的内容,但容器还是那个容器,不会变。你创建3个容器,赋给一样的值,他们也还是3个独立的容器。

但在 Python 中,这个理解是错误的!

Python 中的变量像是一个“标签”,你给一个变量赋值,就是把这个标签贴在一个对象上;重新赋值,就是撕下标签帖到另一个对象上。你给3个变量赋给一样的值,就相当于把3个标签贴在同一个对象上

用例子来说明:

a 

示意图:

39da2c029aa27e646cae18967f9ad0b5.png

通过输出 id(相当于内存地址)也可以说明这点:

aea6a04ce48ddbeea1d6816d409799d4.png

在赋值之后,其实并不是 a 的值发生了变化,而是 a 的地址发生了变化。

理解了这点之后,你就会明白2件事:

  1. 当你给一个变量重新赋值之后,它就不再是之前的那个变量,所有的操作不会再影响到之前的变量上
  2. 当你给多个变量赋值相同的变量,它们其实都是同一个,只要改动其中之一,其他的也会跟着变化。(注意,是改动而非重新赋值,比如修改对象属性)

(补充:有评论指出,这里1,2改成-100,-101,a和c的值就不一样了。是的,因为同样的“值”并不代表是同样的变量。虽然a=-100,c=-100,a未必和c是同一个对象。但经过a=b,甚至d=b,e=b,f=b...这样赋值后的变量,一定都是指向同一个对象。感谢评论指出。)

这个原理,在有关函数的参数传递拷贝对象时都会涉及到,前两天答疑群里就有同学遇到类似的困惑。

有关这点,我之前曾写过几篇文章,再拿出来分享下。之前没看过的同学,强烈建议都看一下,因为你以后多少都会碰到类似的问题:

  1. Crossin:关于函数参数传递,80%人都错了
  2. Crossin:可变对象与不可变对象
  3. Crossin:大家都是拷贝,凭什么你这么秀?

------

一起学,走得远!

欢迎搜索:Crossin的编程教室

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值