Python中有什么不容易让人察觉的有趣的事实?
提起Python,绝大多数同学第一印象就是"简单"。
但是,Python中也有很多有趣、微妙的事情,如果不用心去了解,很容易在开发过程中陷入误区,久久无法自拔。
下面,就介绍几个Python中有趣的事情。1. 微妙的字符串>>> a = "wtf" >>> b = "wtf" >>> a is b True >>> a = "wtf!" >>> b = "wtf!" >>> a is b False >>> a, b = "wtf!", "wtf!" >>> a is b True
是不是觉得很神奇?
为什么加上!返回就是False,不加则返回True?
为什么加上!并放置同一行时,又返回True了?这些行为是由于 Cpython 在编译优化时, 某些情况下会尝试使用已经存在的不可变对象而不是每次都创建一个新对象. (这种行为被称作字符串的驻留[string interning])发生驻留之后, 许多变量可能指向内存中的相同字符串对象. (从而节省内存)在上面的代码中, 字符串是隐式驻留的. 何时发生隐式驻留则取决于具体的实现. 这里有一些方法可以用来猜测字符串是否会被驻留:所有长度为 0 和长度为 1 的字符串都被驻留.字符串在编译时被实现 ("wtf" 将被驻留, 但是 "".join(["w", "t", "f"]) 将不会被驻留)字符串中只包含字母,数字或下划线时将会驻留. 所以 "wtf!" 由于包含 ! 而未被驻留.当在同一行将 a 和 b 的值设置为 "wtf!" 的时候, Python 解释器会创建一个新对象, 然后同时引用第二个变量。如果你在不同的行上进行赋值操作, 它就不会"知道"已经有一个 wtf! 对象 (因为 "wtf!" 不是按照上面提到的方式被隐式驻留的). 它是一种编译器优化, 特别适用于交互式环境.2. is和==的区别>>> a = 256 >>> b = 256 >>> a is b True >>> a = 257 >>> b = 257 >>> a is b False >>> a = 257; b = 257 >>> a is b True
is 运算符检查两个运算对象是否引用自同一对象 (即, 它检查两个运算对象是否相同).== 运算符比较两个运算对象的值是否相等.因此is代表引用相同,==代表值相等. 下面的例子可以很好的说明这点,>>> [] == [] True >>> [] is [] # 这两个空列表位于不同的内存地址. False
256 是一个已经存在的对象, 而 257 不是
当你启动Python 的时候, 数值为 -5 到 256 的对象就已经被分配好了. 这些数字因为经常被使用, 所以会被提前准备好.
Python 通过这种创建小整数池的方式来避免小整数频繁的申请和销毁内存空间.3. is not ... 不是 is (not ...)>>> "something" is not None True >>> "something" is (not None) Falseis not 是个单独的二元运算符, 与分别使用 is 和 not 不同.如果操作符两侧的变量指向同一个对象, 则 is not 的结果为 False, 否则结果为 True.4. 逗号>>> def f(x, y,): ... print(x, y) ... >>> def g(x=4, y=5,): ... print(x, y) ... >>> def h(x, **kwargs,): File "", line 1 def h(x, **kwargs,): ^ SyntaxError: invalid syntax >>> def h(*args,): File "", line 1 def h(*args,): ^ SyntaxError: invalid syntax
在Python函数的形式参数列表中, 尾随逗号并不一定是合法的.在Python中, 参数列表部分用前置逗号定义, 部分用尾随逗号定义. 这种冲突导致逗号被夹在中间, 没有规则定义它.(译:这一句看得我也很懵逼,只能强翻了.详细解释看下面的讨论帖会一目了然.)5. 真亦假True = False if True == False: print("I"ve lost faith in truth!")
输出:I"ve lost faith in truth!
最初, Python 并没有 bool 型 (人们用0表示假值, 用非零值比如1作为真值). 后来他们添加了 True, False, 和 bool 型, 但是, 为了向后兼容, 他们没法把 True 和 False 设置为常量, 只是设置成了内置变量.Python 3 由于不再需要向后兼容, 终于可以修复这个问题了, 所以这个例子无法在 Python 3.x 中执行!
这里只是举了几个例子,上面的例子是从Github上一个非常火热的开源项目wtfpython节选的,目前该项目已经有2.8万+star,受欢迎程度可见一斑。除了英文版,它还有中文版。
它收集了Python中各种各样奇怪且有趣的事情,感兴趣的同学可以花时间多了解一下。
hello,大家好,我是Jackpop,硕士毕业于哈尔滨工业大学,曾在华为、阿里等大厂工作,如果你对升学、就业、技术提升等有疑惑,不妨交个朋友:
我是Jackpop,我们交个朋友吧!
我是Jackpop,我们交个朋友吧!
面试复盘阿里蚂蚁后端面试4月份想暑期实习,也是检测下自己复习的怎么样。内推大概过了一周多的时间,打电话约笔试。笔试过了,然后过了2天约面试。一面电话面,主要项目八股,全程54分钟。阿里巴巴支付宝数据部门说
新款手机销售强劲三星1季度全球市占率居首韩联社网站报道称,根据市场调研机构卡纳利斯咨询公司(Canalys)近日发布的数据,今年第1季度三星电子智能手机的全球市占率为24,位居第1,同比上升2个百分点。排行第2的是苹果手
索爱手机再现,外观与iPhone13Pro撞衫,8256GB仅售879元随着科技的不断发展,我们已经从功能手机时代过渡到智能手机时代。而曾经的那些先驱早已不复在,如今已是苹果三星华米OV以及荣耀等友商的天下。这便是为何事事都要与时俱进,若你不努力提升自
HIFI系统搭建(价格)(接上期)因为数字音频文件无论是获取的途径还是价格都比CD有太大的优势,所以我认为最容易达到初烧。系统应该是数播解码器后级音箱,价格是25万元。首先谈价格很多人认为老烧们口中常说的
华为汽车快速充电桩专利公布充电功率最小为满载功率华为汽车快速充电桩专利公布充电功率最小为满载功率财联社4月29日电,据天眼查显示,4月29日,华为数字能源技术有限公司一种充电桩及控制方法专利公布。摘要显示,该充电桩包括用于为电动
技术折射人性,选择决定未来互联网大数据技术正不断重塑社会结构形态,将数字智能服务送至千家万户,我们随时随地就能享受到便捷的服务多样的产品。伴随数字生活而来的,还有消费主义娱乐至上等不良风潮,一些员工被困在算
LeetCode刷题实战594最长和谐子序列算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面
4月28日区块链资讯汇总(四)1457三星资产管理将于今年上半年在香港上市包含实际加密货币的区块链ETF4月28日消息,韩国资管公司三星资产管理将于今年上半年在香港上市一只区块链交易所交易基金(ETF)。这是亚
触摸显示器,采用开放式架构,适合游戏游艺产业应用作为全球领先的嵌入式平台解决方案提供商,推出一款游戏游艺专用的21。5全高清开放式架构宽屏显示器ID3121GD系列。该款新型IDS3121GD开放式架构显示器集成了IPS技术,可
国家智慧教育平台上线满月浏览量大幅增加中新网4月28日电28日,教育部召开新闻发布会,介绍国家教育智慧平台建设和应用进展有关情况。教育部新闻办主任新闻发言人续梅在会上表示,3月28日国家智慧教育平台正式上线运行,推出了
孩子外公服刑过一年。孩子报考警官学院政审能通过吗?答不能。报考警官学院政审要求三代没有犯罪记录。警校生政审考查对象1。考生本人及其兄弟姐妹2。父母(或养父母)及其兄弟姐妹3。祖父母外祖父母。涉及本人外政审对象无论离婚或逝世均不受影