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)
False
is 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 "<stdin>", line 1
def h(x, **kwargs,):
^
SyntaxError: invalid syntax
>>> def h(*args,):
File "<stdin>", 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中各种各样奇怪且有趣的事情,感兴趣的同学可以花时间多了解一下。
深入了解Python,才会发现它有很多不容易被人察觉的事实。对于不了解的“小白”,更加容易踩坑。
读者福利:如果你喜欢编程,那这套python学习资料一定对你有用,
对于0基础小白入门:
如果你是零基础小白,想快速入门Python是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以找到适合自己的学习方案
包括:Python安装包+激活码、Python web开发,Python爬虫,Python数据分析,人工智能、机器学习等教程。带你从零基础系统性的学好Python!
零基础Python学习资源介绍
👉Python学习路线汇总👈
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。(学习教程文末领取哈)
👉Python必备开发工具👈
温馨提示:篇幅有限,已打包文件夹,获取方式在:文末
👉Python学习视频600合集👈
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
👉实战案例👈
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉100道Python练习题👈
检查学习结果。
👉面试刷题👈
资料领取
这份完整版的Python全套学习资料已为大家备好,朋友们如果需要可以微信扫描下方二维码添加,输入"领取资料" 可免费领取全套资料【有什么需要协作的还可以随时联系我】朋友圈也会不定时的更新最前言python知识。
好文推荐
了解python的前景: https://blog.csdn.net/weixin_49892805/article/details/127196159
了解python的副业: https://blog.csdn.net/weixin_49892805/article/details/127214402
相关文章
- python 单下划线/双下划线使用总结
- Python开发环境搭建
- 如何使用python自定义命令
- python 检测字符串编码类型是什么
- [FAQ] Python list 的值是带有小括号的是什么意思 ?
- 用python进行办公自动化都需要学习什么知识呢?
- 为什么总有人说人生苦短我用Python,Python能帮我们做什么?
- 神了!用Python预测世界杯决赛,发现准确率还挺高!
- Python语言学习之文件夹那些事:python和文件夹的使用方法之详细攻略
- 我是什么情况下开始学python,现在能用python做些什么
- Python中的多线程是什么?如何实现?(附零基础学习资料)
- 用Python制造雪景图,体验 “ 人工下雪 ” 得快乐~
- Python中@符号是什么意思?
- Python学习78:XML
- Python 中的 -> 是什么意思
- BaezaYates 交集python和golang代码
- 【Python 3】什么时候使用yield而不是return?
- Python中的数据结构
- 学习Python可以做什么工作?选什么方向?