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

前言

定义变量还需要讲解?

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

3128b0c0d6d3186ed88becce8b7da3f8.png

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

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

  1. 为什么不要用 list 、range 等等这些作为变量名字?

  2. 为什么自定义函数中的默认值参数,不要用 列表 等可变类型?

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

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


为什么变量这么重要

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

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

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

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

92a33492107c4271ff91a33560344ef8.png
  • 你可以把对象看作是多个数据的组合(数据结构)

  • 一个列表就是一个对象

  • 不仅仅是列表,诸如 int、str 这些基本的数据,都会存活在这个 "对象区" 中

  • 每个对象有一个唯一的数字 id 编号(就看作是身份证号码吧)

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

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

如下代码:

f0caa5ca5b293bebad026f1b040a0c87.png
  • 行2:通常会说,s2 赋值给 s1。但是赋的是什么样的值?那是对象的 id 值

  • 行4:所以,此时通过 s2 对 列表操作,做事情的是"对象区" 上的列表对象。如下:

b2e7c71b2ac28f29cb659ca82d809778.png
  • 注意图上的箭头,这就是为什么有些教程会说"变量指向 xxx 对象"

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


函数也是对象

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

如下自定义函数:

6e637c8857db2ead8f95133073672f3f.png

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

d5dc0c6fd3181d3a7600ec5ec9dc3c92.png
  • 函数中的代码并没有执行,但这些代码的逻辑作为数据被保存在函数对象中

  • 函数名字实际是一个变量,指向了函数对象

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

的确如此。

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

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

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

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

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

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


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

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

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

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

如下自定义函数:

6c4430a75f00665459a7cd5f4da4fdcc.png
  • 在一次完整的代码运行期间(就是上述整个代码从上到下执行一次),由于函数对象只创建了一次,他的默认参数的 data 一直是同一个列表对象

  • 256e695b36a446837265b95fc2531aba.png
  • 行5:此行被执行,进入到函数对象逻辑(行2)时,参数 data 的默认列表对象被加入了值1

    fe8714577cf1b85e9d7d2449e1324e35.png
  • 行6 :由于调用时,传给 data 参数的是一个新的列表对象([1,2,3,4]) ,因此进入行2时,data.append 是针对行6生成的列表对象

    9d699fdab6860bcff67d19a5128a06b7.png
  • 行7:与行5同理,行2是对参数 data的默认列表对象操作

587d62079855227ba0e6fe80b38dc52e.png

导入包也是在定义变量

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

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

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

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

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

a4676f8eeeffb55e422c519d7e7fece6.png

答疑

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

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

以下代码会报错吗?

0372f197a4af1938c21e5299ce76cdda.png
  • 会。

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

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

62d7221b726aad2b301096a3b3ba6940.png

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


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

b1eac163f63b7724f39d6d9f096110dc.png
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值