中data定义数字类型_多了解Python一点点,为什么我们需要定义变量?

本文探讨了Python中变量的本质,指出变量实际上保存的是对象的ID,而非数据本身。解释了为何不应将列表等可变类型作为默认参数,并介绍了函数作为对象的特性,包括函数的默认参数、导入模块与变量的关系。通过实例解析了变量的赋值、函数调用及导入库的过程,强调了理解这些概念对于编程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

c9895e8b44d51cdd70194e21fed16c31.png

前言

定义变量还需要讲解?

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

9811a25b0f4db5cb5ec3263dc406603d.png

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

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

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

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

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


为什么变量这么重要

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

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

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

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

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

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

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

如下代码:

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

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


函数也是对象

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

如下自定义函数:

e56bf7169e236724624944c960802d10.png

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

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

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

的确如此。

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

1f64f3ae4367f11b4db81874c06c3201.png
  • 现在2个变量都能调用同一个函数

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

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

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

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

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

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

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

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

如下自定义函数:

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

导入包也是在定义变量

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

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

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

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

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

5cab2ed65225201db49dbc85072b2ad2.png

答疑

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

9811a25b0f4db5cb5ec3263dc406603d.png
  • 5个变量。分别是 pd、numpy、load_data、a、b

以下代码会报错吗?

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

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

d574726b5bf8bf6bf13cf422a700a23a.png

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

98cf58475b23a904e9d0de9692d4c8ad.png

创作不易,记得点赞关注噢

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值