前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于Python的变量,我就说一句话

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

作者头像
Crossin先生
发布2019-09-04 14:08:22
4490
发布2019-09-04 14:08:22
举报

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

代码语言:javascript
复制
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个标签贴在同一个对象上

用例子来说明:

代码语言:javascript
复制
a = 1
b = 2
c = 1
# 再次赋值
a = b

示意图:

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

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

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

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

这个原理,在有关函数的参数传递拷贝对象时都会涉及到

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档