前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多了解Python一点点,为什么我们需要定义变量?

多了解Python一点点,为什么我们需要定义变量?

作者头像
咋咋
发布2021-09-01 12:12:57
9380
发布2021-09-01 12:12:57
举报
文章被收录于专栏:数据大宇宙

前言

定义变量还需要讲解?

你能说出来,以下代码定义了多少个变量吗:

如果你的答案是2个,那么希望看完本文后你会有不一样的回答。

再看一些类似教条式的规范:

  1. 为什么不要用 list 、range 等等这些作为变量名字?
  2. 为什么自定义函数中的默认值参数,不要用 列表 等可变类型?

本文的内容能帮助你理解这些知识点。

本文不是讲解如何定义变量,也不打算按照市面上的教程逻辑讲解,希望我能让你对变量带来一些新的理解。


为什么变量这么重要

如下代码生成了一个列表:

  • 执行过程中,这里面到底发生了什么事情?

很多人知道,这是生成了一个列表。

Python 在背后做了许多事情,姑且想象他有一个"对象区",保存了这个列表:

  • 你可以把对象看作是多个数据的组合(数据结构)
  • 一个列表就是一个对象
  • 不仅仅是列表,诸如 int、str 这些基本的数据,都会存活在这个 "对象区" 中
  • 每个对象有一个唯一的数字 id 编号(就看作是身份证号码吧)

如果把对象看作是生活上的人类,把对象的 id 看作是身份证号码。那么当你需要使唤某个人做事情,你就必需通过身份证号码才能与他沟通

变量,就是让你能与 "对象区" 的对象沟通的工具。也就是说,变量本质上保存的不是数据对象本身,而是保存了对象的"身份证号码"。

如下代码:

  • 行2:通常会说,s2 赋值给 s1。但是赋的是什么样的值?那是对象的 id 值
  • 行4:所以,此时通过 s2 对 列表操作,做事情的是"对象区" 上的列表对象。如下:
  • 注意图上的箭头,这就是为什么有些教程会说"变量指向 xxx 对象"

这些都很好理解,而自定义函数,其实与上面生成列表"赋值"给变量是一样的过程!


函数也是对象

Python 号称"一切皆对象",这不是随便说说。

如下自定义函数:

执行到 def 这行代码时,Python 会在 "对象区" 生成函数对象:

  • 函数中的代码并没有执行,但这些代码的逻辑作为数据被保存在函数对象中
  • 函数名字实际是一个变量,指向了函数对象

这让自定义函数与普通的列表没有多大区别。

的确如此。

既然函数本身也是对象,自然可以有多个变量同时指向他:

  • 现在2个变量都能调用同一个函数

用2个变量指向同一个函数,好像没有多大用处。实际上,这能让我们随意把某个函数传递到其他函数中。

函数表达是一系列操作逻辑,这意味着我们可以把固定的逻辑写好,需要的时候就能调用。

比如,在 pandas 中到处可见这种情况:

  • 任何的现代编程语言,基本都具备这种把函数到处传递的机制

刚刚说到,自定义函数里面的代码作为数据被保存在函数对象中。

那么,函数对象里面还能保存什么数据吗?

函数对象中保存的数据,基本是函数的一些相关属性,比如每个参数的名字等。

其中,如果是默认参数,里面还会保留其默认值(实际上保存的只是默认值对象的 id)

如下自定义函数:

  • 在一次完整的代码运行期间(就是上述整个代码从上到下执行一次),由于函数对象只创建了一次,他的默认参数的 data 一直是同一个列表对象
  • 行5:此行被执行,进入到函数对象逻辑(行2)时,参数 data 的默认列表对象被加入了值1
  • 行6 :由于调用时,传给 data 参数的是一个新的列表对象([1,2,3,4]) ,因此进入行2时,data.append 是针对行6生成的列表对象
  • 行7:与行5同理,行2是对参数 data的默认列表对象操作

导入包也是在定义变量

平时导入 pandas 或 numpy 等库,习惯写出如下导入包的代码:

  • 其中的 as xxx ,就是定义了变量,指向了对应的模块对象

那么,如果只是写 import ,没有用 as ,难道就没有定义变量?

这是不可能的。没有变量,我们后续就不可能使用该包的功能。

默认情况下(没有使用 as) ,变量名字就是包或模块完整名字。导入后其实我们可以随意使用新的变量:


答疑

以下代码定义了多少个变量?

  • 5个变量。分别是 pd、numpy、load_data、a、b

以下代码会报错吗?

  • 会。
  • 本来行2希望调用的是 Python 内置函数 list,但是却在行1中改变了变量 list 的指向

有没有什么骚操作能临时占用变量?

list 是定义在 Python 内置命名空间中,因此上述例子直接通过 del list ,把变量删除,后续就能恢复访问默认的 list


最后给一个题目,你认为以下代码输出是什么,为什么?

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

本文分享自 数据大宇宙 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 为什么变量这么重要
  • 函数也是对象
  • 导入包也是在定义变量
  • 答疑
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档