Python中的"变量"为什么不能理解为盒子?

10/17 07:01
阅读数 31


作为毫无编程基础的Python初学者,初读“蟒蛇书”(下图),其中作者将“变量”描述为标签,而不是存储值的盒子,这一度让我很迷惑,作者也并未详细说明缘由,为什么要将变量理解为赋给值的标签?是否可以通过例子去解释和复现这种说法的正确性?“标签”的说法又是源于什么?


真正零基础入门python经典教材“蟒蛇书”


有开发者书友推荐了《流畅Python》一书,其中有对变量的理解和解释。以下内容引自原书第8章《变量不是盒子》一文。

1997 年夏天,我在 MIT 学了一门 Java 课程。Lynn Andrea Stein 教授(一位获奖的计算机 科学教育工作者,目前在欧林工程学院教书)指出,人们经常使用“变量是盒子”这样的比喻,但是这有碍于理解面向对象语言中的引用式变量。Python 变量类似于 Java 中的引用式变量,因此最好把它们理解为附加在对象上的标注。


在示例8-1 所示的交互式控制台中,无法使用“变量是盒子”做解释。图8-1 说明了在 Python 中为什么不能使用盒子比喻,而便利贴则指出了变量的正确工作方式。


示例 8-1变量 a 和 b 引用同一个列表,而不是那个列表的副本 


  
  
  1. a = [1, 2, 3]

  2. b = a

  3. a.append(4)

  4. print(b)


输出结果为:[1, 2, 3, 4]


图 8-1:如果把变量想象为盒子,那么无法解释Python 中的赋值;应该把变量视作便利贴,这样示 例 8-1 中的行为就好解释了


添加笔记:补充说明,如果将a和b两个变量理解为盒子的话,先把a盒子里的值同时赋给b盒子,然后在a列表里增加数字4,如果输出b的话,输出应为[1, 2, 3]。


Stein 教授还反复讲解了赋值方式。例如讲到seesaw对象时,她会说“把变量s分配给 seesaw”,绝不会说“把 seesaw 分配给变量 s”。对引用式变量来说,说把变量分配给对象更合理,反过来说就有问题。毕竟,对象在赋值之前就创建了。示例 8-2 证明赋值语句的右边先执行。


示例 8-2 创建对象之后才会把变量分配给对象 


  
  
  1. >>>classGizmo:

  2. ... def __init__(self):

  3. ... print('Gizmo id: %d'% id(self))

  4. ...

  5. >>>x = Gizmo()

  6. Gizmo id: 4301489152

  7. >>>y = Gizmo() * 10

  8. Gizmo id: 4301489432

  9. Traceback(most recent call last):

  10. File"<stdin>", line 1, in <module>

  11. TypeError: unsupported operand type(s) for*: 'Gizmo' and 'int'

  12. >>>

  13. >>>dir() ➍ ['Gizmo''__builtins__''__doc__''__loader__''__name__''__package__''__spec__''x']


➊ 输出的 Gizmo id: ... 是创建 Gizmo 实例的副作用。

➋ 在乘法运算中使用 Gizmo 实例会抛出异常。

➌ 这里表明,在尝试求积之前其实会创建一个新的 Gizmo 实例。

➍ 但是,肯定不会创建变量 y,因为在对赋值语句的右边进行求值时抛出了异常。


为了理解 Python 中的赋值语句,应该始终先读右边。对象在右边创建或获 取,在此之后左边的变量才会绑定到对象上,这就像为对象贴上标注。忘掉盒子吧!


因为变量只不过是标注,所以无法阻止为对象贴上多个标注。贴的多个标注,就是别名。 


关于对变量的理解,是否还有其他说法和解释?


最后,强烈安利这本“蟒蛇书”,尤其适合0编程基础的同学,听说最近出了第2版,内容更新不少。


先来说说这本书的特色,书中遵循了遵循了知识点 - 动手 - 总结的三阶段方法,以实践为主,项目为纲:

  • 每行代码,都进行了逐行解释

  • 每章节的动手练一练都配有答案解析和解读思路

  • 第2部分的三个项目,小游戏、数据可视化与Web应用程序,基本覆盖了python在实际业务场景下主流应用。

  • 附带的资源就更多了,随书视频讲解,速查地图(全书知识点的总结),python阅读地图等。


当然,就像晓阳老师说的那样,很多人喜欢用电脑+谷歌引擎来学习知识,也有很多人依旧喜欢买实体书籍来学习知识,两者只有形式上的不同,谈不上对错。例如Python有海量的在线资源可以学习,方便又实用;但如果在台灯之下打开一本笔墨香的书籍,则是能够唤醒上学时刻苦读书的记忆,依旧是很多人高效学习的秘籍。


只要是适合自己的学习方式,怎样用都是对的。

再补充一句,听说本书第1版豆瓣评分9.1,京东/当当/亚马逊计算机图书榜首。如果这本书正是你需要的,点击下方链接,欢迎大家一起加入“蟒蛇书”书友会。

送书规则


为了让更多的粉丝,得到自己想要的书。因此我尽量不都采取“凭运气”抽奖的形式抽奖,而是大部分采取留言点赞的形式,凭实力获取书籍,同时同一个人一个月内不可能中奖多次,所以希望还是挺大的,大家加油呀。


赠书方式一:

留言集赞送出2:本文留言中【说说你对“数据分析”行业的看法!】,点赞排名前2名的读者获得。恶意刷赞监控到后,立即取消资格


赠书方式二:

抽奖送出1长按下方小程序,参与抽奖。

开奖时间:10月19日 18:00,自动开奖(上述提到的2本书,任意选择哦)


注意:2个都参与,机会更大呀!中奖者24小时内,必须添加我微信领取,逾期当作废!【限粉丝参与,中奖后关注不算哦】


要求:为了让更多的粉丝抽中获得自己想要的书,每个人当月仅且只能中奖一次,本月已经中奖者,如果在被抽中,将不在赠书。

本文分享自微信公众号 - 数据分析与统计学之美(gh_21c25c7e71d0)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部