我在python中做了一些事情(使用python 3.3.3),我遇到了令我困惑的事情,因为我的理解课每次被调用时都会得到一个新的id.
让我们说你在一些.py文件中有这个:
class someClass: pass
print(someClass())
print(someClass())
Run Code Online (Sandbox Code Playgroud)
以上返回相同的id,这让我感到困惑,因为我正在调用它所以它不应该是相同的,对吧?当连续两次调用同一个类时,python是如何工作的?当我等待几秒钟时,它给出了不同的id,但是如果我像上面的例子一样,它似乎不会那样工作,这让我感到困惑.
>>> print(someClass());print(someClass())
<__main__.someClass object at 0x0000000002D96F98>
<__main__.someClass object at 0x0000000002D96F98>
Run Code Online (Sandbox Code Playgroud)
它返回相同的东西,但为什么呢?我也注意到范围,例如
for i in range(10):
print(someClass())
Run Code Online (Sandbox Code Playgroud)
当快速调用类时,python是否有任何特殊原因?我甚至不知道python是这样做的,还是可能是一个bug?如果它不是一个bug,有人可以向我解释如何修复它或一个方法,以便每次调用方法/类时它生成一个不同的id?我很困惑这是怎么做的,因为如果我等了,它确实会改变,但如果我尝试两次或更多次调用同一个类则不会.
我以为is操作员检查对象id的相等性.但它似乎并非如此:
>>> class A(object):
... def f(): return 1
... def g(): return 2
...
>>> a = A()
>>> a.f is a.g
False
>>> id(a.f) == id(a.g)
True
Run Code Online (Sandbox Code Playgroud) float(1.0) is float(1.0) #True
float(1) is float(1) #False
Run Code Online (Sandbox Code Playgroud)
我已将float()奇怪性与此对象创建顺序隔离开来,因为
x1 = float(1)
x2 = float(1)
x1 is x2 #False
id(x1) == id(x2) #False
y1 = float(1.0)
y2 = float(1.0)
y1 is y2 #True
id(y1) == id(y2) #True
Run Code Online (Sandbox Code Playgroud)
注意:我已经检查了浮点数的精度,这不是发生这种情况的原因.
我想了解Python为何以及如何决定创建浮动对象.为什么float(1.0)指向同一个对象,而float(1)指向两个不同的对象,当它们被创建两次时?
另外,有待进一步参考:
float(1) is float(1) #False
id(float(1)) == id(float(1)) #True
float(1.0) is float(1.0) #True
id(float(1.0)) == id(float(1.0)) #True
Run Code Online (Sandbox Code Playgroud) 我在跑:
Python 2.7.8 (default, Oct 6 2017, 09:25:50)
GCC 4.1.2 20070626 (Red Hat 4.1.2-14) on Linux 2
Run Code Online (Sandbox Code Playgroud)
根据文件:
运营商
is和is not测试对象标识:x is y是True当且仅当x和y是相同的对象.
为了获得对象的身份,我们可以使用该id功能.
如果我们打开一个新的REPL,我们可以看到它300并-6具有相同的标识(在CPython上,这意味着它们都引用相同的内存地址):
>>> id(300)
94766593705400
>>> id(-6)
94766593705400
Run Code Online (Sandbox Code Playgroud)
请注意,实际值可能因执行而异,但它们始终相等.
然而,做300 is -6收益率False:
>>> 300 is -6
False
Run Code Online (Sandbox Code Playgroud)
我有一些问题:
300和-6分享相同的身份? …