关于Python的变量,我就说一句话

在多年开发和教学 Python 的过程中,有一个 bug,出现的频率非常高,经常有人会踩坑:
person = {'name': '', 'id': 0}team = []
for i in range(3): x = person x['id'] = i team.append(x)
team[0]['name'] = 'Jack'team[1]['name'] = 'Pony'team[2]['name'] = 'Crossin'
print(team[1])
你觉得输出结果是什么?
在电脑上执行下,看看和你想的是否一样?
一种很常见的错误,就是觉得 team 这里列表(list)里是三个独立的字典(dict)对象。然而看了输出你就会发现,列表中的三个元素长得一样。而且,如果你之后再更改任何一个的 name 或 id 属性,另外两个也会跟着变。

为什么会这样?

这个问题,就是我今天要说的话:
在 Python 中,你要把变量想象成一个标签,而不是一个容器
什么意思?在某些语言中,变量确实像一个“容器”,你定义了某种类型的变量,就给你分配好这个容器,之后你给变量赋值,就像是往容器里装入不同的内容,但容器还是那个容器,不会变。你创建3个容器,赋给一样的值,他们也还是3个独立的容器。

但在 Python 中,这个理解是错误的!
Python 中的变量像是一个“标签”,你给一个变量赋值,就是把这个标签贴在一个对象上;重新赋值,就是撕下标签帖到另一个对象上。你给3个变量赋给一样的值,就相当于把3个标签贴在同一个对象上
用例子来说明:
a = 1b = 2c = 1# 再次赋值a = b
示意图:
通过输出 id(相当于内存地址)也可以说明这点:
在赋值之后,其实并不是 a 的值发生了变化,而是 a 的地址发生了变化。
理解了这点之后,你就会明白2件事:
  1. 当你给一个变量重新赋值之后,它就不再是之前的那个变量,所有的操作不会再影响到之前的变量上

  2. 当你给多个变量赋值相同的变量,它们其实都是同一个,只要改动其中之一,其他的也会跟着变化。(注意,是改动而非重新赋值,比如修改对象属性)

这个原理,在有关函数的参数传递拷贝对象时都会涉及到,前两天答疑群里就有同学遇到类似的困惑。
有关这点,我之前曾写过几篇文章,再拿出来分享下。之前没看过的同学,强烈建议都看一下,因为你以后多少都会碰到类似的问题:
  1. 函数的参数传递

  2. 可变对象与不可变对象

  3. 关于深浅拷贝


(0)

相关推荐

  • 利用 Python 一键下载网易云音乐 10W+ 乐库

    来源:Python 技术「ID: pythonall」 如果你常听音乐的话,肯定绕不开网易云,作为一款有情怀的音乐 App,我对网易云也是喜爱有加.虽然说现在都已经是 5G 时代了,大家的手机流量都绰 ...

  • 如何使用 Python 和 BeautifulSoup 爬取网站

    作者丨Justin Yek 译者丨平川 互联网上的信息如此之多,任何人穷其一生也无法全部消化吸收.你需要的不是访问这些信息,而是一种可伸缩的方式,可以用来收集.组织和分析这些信息.你需要的是 Web ...

  • 【Python面试】 说说Python可变与不可变数据类型?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • 第104天: Python 解析 XML

    第104天: Python 解析 XML

  • python测试开发django-71.自定义标签tag

    前言 django的模板里面有很多标签可以快速实现一些功能,比如{% url url_name%} 可以快捷的导入一个本地url地址. 上一篇我们可以自定义一些过滤器https://www.cnblo ...

  • 零基础学Python:数值类型和运算符

    数值类型 1.int(整形) 在 Python 中定义变量是 不需要指定类型(在其他很多高级语言中都需要) 整形,也被称之为整数.整数就是数学中的数字. 整形在Python中不受长度限制大小范围 定义 ...

  • python基础入门教程:传参是传值还是传引用

    在此之前先来看看变量和对象的关系:Python 中一切皆为对象,数字是对象,列表是对象,函数也是对象,任何东西都是对象.而变量是对象的一个引用(又称为名字或者标签),对象的操作都是通过引用来完成的.例 ...

  • 一文介绍Python变量的三个特征

    对于每个变量,python都提供了这三个方法分别获取变量的三个特征,其中python的内置功能id(),内存地址不一样,则id()后打印的结果不一样,因为每一个变量值都有其内存地址,而id是用来反映变 ...

  • 一文讲解Python基础变量类型

    对于Python,变量不需要预先声明,而是在创建时直接分配它,变量的类型取决于赋给变量的值.值得一提的是,一旦要创建一个变量,您需要为该变量赋值. 有一种"平民"的说法是,变量好比 ...

  • 说说Python中变量的作用域?

    公众号新增加了一个栏目,就是每天给大家解答一道Python常见的面试题,反正每天不贪多,一天一题,正好合适,只希望这个面试栏目,给那些正在准备面试的同学,提供一点点帮助! 小猿会从最基础的面试题开始, ...

  • python - 内置对象 之 变量

    一.变量命名规划 1.命名规则 (1)命名内容只能是字母.下划线.数字 (2)名字第1字符只能是字母或下划线 (3)区分大小写 2.私有变量 (1)_xxx "单下划线" 开始的成 ...

  • Python变量的定义以及使用

    任何编程语言都需要处理数据,比如数字.字符串.字符等,我们可以直接使用数据,也可以将数据保存到变量中,方便以后使用. 变量(Variable)可以看成一个小箱子,专门用来"盛装"程 ...

  • python注释、变量、常量的学习

    注释.变量.常量的学习 注释 什么是注释 注释是对代码的解释,方便后期的阅读代码,可以使在后期的代码维护中事半功倍. 注释的作用 注释可以用来排查代码中的BUG,在一段有BUG的代码当中,用注释选中其 ...

  • 醒醒!Python已经支持中文变量名啦!

    最近,我在翻阅两本比较新的 Python 书籍时,发现它们都犯了一个严重的低级错误! 这两本书分别是<Python编程:从入门到实践>和<父与子的编程之旅>,它们都是畅销书,都 ...

  • python笔记11-多线程之Condition(条件变量)

    前言 当小伙伴a在往火锅里面添加鱼丸,这个就是生产者行为:另外一个小伙伴b在吃掉鱼丸就是消费者行为.当火锅里面鱼丸达到一定数量加满后b才能吃,这就是一种条件判断了. 这就是本篇要讲的Condition ...

  • python接口自动化25-全局变量token项目设计

    获取token 在做接口自动化的时候,经常会遇到多个用例需要用同一个参数token,并且这些测试用例跨.py脚本了. 一般token只需要获取一次就行了,然后其它使用unittest框架的测试用例全部 ...

  • python笔记30-docstring注释添加变量

    前言 """美程序员枪击4同事,竟因代码不写注释?""" python里面添加字符串注释非常简单,如何将变量放入 python 的函数注释里 ...