资讯专栏INFORMATION COLUMN

Python 中 is 语法带来的误解

Yuqi / 3372人阅读

摘要:起步的成功一个原因是它的可读性,代码清晰易懂,更容易被人类所理解,但有时可读性会产生误解。的误解但是如果你尝试这个判断不见得管用。用来检查左侧和右侧是否是完全相同的对象。每种语言的结构都存在一些出乎意料的使用。

起步

Python 的成功一个原因是它的可读性,代码清晰易懂,更容易被人类所理解,但有时可读性会产生误解。

假如要判断一个变量是不是 17,那可以:

if x is 17:

x 是 17 肯定是比 x == 17 更加口语化的。

is的误解

但是如果你尝试:

if name is "weapon":

这个判断不见得管用。is 用来检查左侧和右侧是否是完全相同的对象。如果有两个不同的字符串对象,每个对象的值是相同的,应该使用 == 来判断,因为 is 的用法与口语上的区别挺大的:

if 999 + 1 is 1000:  # False

正因为这样的误解,在 if 判断条件上容易让初学者掉坑:

answer = "yes"
if answer is "y" or "yes":

你会发现不管变量是什么值,判断都是为真。因为 is 的优先级高,相当于 if (answer is "y") or ("yes")

正确的方法应该是 if answer == "y" or answer == "yes" 或者 if answer in ("y", "yes")

is not 上的混淆
>>> "something" is not None
True
>>> "something" is (not None)
False

is not 是一个二元运算符,应该视为一个整体,不要因为中间空格而当成两个词。底层上,它们也是一个操作符,CPython 将 s is not None 翻译成的字节码为:

 6 LOAD_NAME                0 (s)
 8 LOAD_CONST               1 (None)
10 COMPARE_OP               9 (is not)

is not 是对 is 相对应的操作符。也可以视为是将 is 判断的结果再进行取反。

总结

我同意 Python 非常易读。每种语言的结构都存在一些“出乎意料”的使用。这并不影响我对 Python 这门语言的喜爱,每个人都应该好好学习,并小心使用选择的语言。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43713.html

相关文章

  • 备胎自我修养——趣谈 JavaScript ASI (Automatic Semicolon

    摘要:行结束符之后的符号有二义性,使得该符号与上条语句能够无缝对接,不导致语法错误。然而在中,有几种特殊语句是不允许行结束符存在的。如果语句中有行结束符,会优先认为行结束符表示的是语句的结束,这在标准中称为限制产生式。 showImg(https://segmentfault.com/img/bVmyZB); 什么是 ASI ? 自动分号插入 (automatic semicolon i...

    _ipo 评论0 收藏0
  • 编程语言之问:何时该借用,何时该创造?

    摘要:普通可迭代对象只有魔术方法,而不像迭代器一样拥有魔术方法,这意味着它无法实现自遍历过程,同时在经过循环的它遍历后,也不会破坏原有的结构。这两个是我创造的概念,详见进阶迭代器与迭代器切片。 showImg(https://segmentfault.com/img/remote/1460000019621809); 本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:...

    spademan 评论0 收藏0
  • 为什么print在Python 3变成了函数?

    摘要:如果你以逗号为分隔符,传递额外的参数,这些参数会被传递至函数,最终打印时每个参数之间会空一格。从上面的示例代码中我们就可以看出,使用函数有明显的好处与使用语句相比,我们现在能够指定其他的分隔符和结束符。这就是为什么将变成函数的原因。 本文首发于编程派的微信公众号。 原作者:Brett Cannon 原文链接:http://www.snarky.ca/why-print-became-...

    taoszu 评论0 收藏0
  • [零基础学Python]赋值,简单也不简单

    摘要:以上原则,是基本原则。比如用指一组账号,就会被人误解为是类型的数据,事实上可能是也可能不是。不论如何,要记住一个标准明确赋值语句对于赋值语句,看官已经不陌生了。其实,赋值的样式不少,核心就是将变量和某对象对应起来。 变量命名 在《初识永远强大的函数》一文中,有一节专门讨论取名字的学问,就是有关变量名称的问题,本温故而知新的原则,这里要复习: 名称格式:(下划线或者字母)+(任意数目...

    church 评论0 收藏0
  • 这5篇文章将使你成为一个Angular Change Detection专家。

    摘要:编写工作首先介绍了一个称为的内部组件表示,并解释了变更检测过程在视图上运行。本文主要由两部分组成第一部分探讨错误产生的原因,第二部分提出可能的修正。它对我意义重大,它能帮助其他人看到这篇文章。 在过去的8个月里,我大部分空闲时间都是reverse-engineering Angular。我最感兴趣的话题是变化检测。我认为它是框架中最重要的部分,因为它负责像DOM更新、输入绑定和查询列表...

    Coly 评论0 收藏0

发表评论

0条评论

Yuqi

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<