leisurelicht / wtfpython-cn

wtfpython的中文翻译/施工结束/ 能力有限,欢迎帮我改进翻译

Home Page:https://github.com/leisurelicht/wtfpython-cn/blob/master/CONTRIBUTING.md

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Section: Strain your brain! --> Strings can be tricky sometimes *中有条示例似乎已经不适用了

RocShi opened this issue · comments

首先,感谢作者的辛勤劳作,实践中发现Strings can be tricky sometimes/微妙的字符串 *中第2段代码段最后一条示例在我的环境中的运行结果与文中恰恰相反,原文中是这样的:

>>> a, b = "wtf!", "wtf!"
>>> a is b
True

我的环境中是这样的:

$ python3
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a, b = "wtf!", "wtf!"
>>> a is b
False

我的操作环境:windows 10企业版(64位操作系统,基于x64处理器),Python 3.7.1(64位)。
请查证。

你好,我测试了3.7.0和3.7.1,确实从3.7开始这条的结果就变了。

多谢你的细心测试,我会在文中注明这点并将你加入到贡献者名单里,欢迎继续给我提issue。

我发现原文的issue里已经有了对这个问题的讨论。而且有人发现使用 int() 就可以让 3.7 和 3.6 的表现一致。详细原因还需要我再研究下。

看了satwikkansal/wtfpython#100 (comment) 这个comment感觉更有意思了,请看Python 3.7.1中下面的示例:

$ python3
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> a = 10
>>> b = 10
>>> a is b
True
>>> a = 256
>>> b = 256
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a is b
False

So interesting, but why?

这个是由于python会在一开始就把一定范围内的数都创建好。

如果你要创建的数在这个范围内,就直接引用python准备好的对象,不再新建,超出这个范围就会新建对象。而257刚好朝纲。

我找到一篇比较好的解释,你可以看看。

@leisurelicht 好的,谢谢。PS: 你这篇解释文章是刚写的吧,还热乎着😅

以前从知乎上转下来的,但是都存在本地。为了有个稳定的链接能给你看才上传。

Python 3.6.8 (default, Apr 11 2019, 11:52:43)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.10.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: a = 256
In [2]: b = 256
In [3]: a is b
Out[3]: True

In [4]: a = 257
In [5]: b = 257
In [6]: a is b
Out[6]: False

In [7]: a = -5
In [8]: b = -5
In [9]: a is b
Out[9]: True

In [10]: a = -6
In [11]: b = -6
In [12]: a is b
Out[12]: False

who can tell me why?

Python 3.6.8 (default, Apr 11 2019, 11:52:43)
Type 'copyright', 'credits' or 'license' for more information
IPython 7.10.1 -- An enhanced Interactive Python. Type '?' for help.
In [1]: a = 256
In [2]: b = 256
In [3]: a is b
Out[3]: True

In [4]: a = 257
In [5]: b = 257
In [6]: a is b
Out[6]: False

In [7]: a = -5
In [8]: b = -5
In [9]: a is b
Out[9]: True

In [10]: a = -6
In [11]: b = -6
In [12]: a is b
Out[12]: False

who can tell me why?

see https://zhuanlan.zhihu.com/p/33907983