提起 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 中执行!
以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python 编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩 Python 电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。