相关疑难解决方法(0)

为什么在快速调用时,Python类的id不是唯一的?

我在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?我很困惑这是怎么做的,因为如果我等了,它确实会改变,但如果我尝试两次或更多次调用同一个类则不会.

python class python-3.x

32
推荐指数
2
解决办法
9888
查看次数

为什么同一个对象的不同方法具有相同的`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)

python

16
推荐指数
2
解决办法
1888
查看次数

float()对象id创建顺序

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 floating-point python-3.x

6
推荐指数
1
解决办法
116
查看次数

'is'运算符不处理具有相同标识的对象

我在跑:

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)

根据文件:

运营商isis not测试对象标识:x is yTrue当且仅当xy相同的对象.

为了获得对象的身份,我们可以使用该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分享相同的身份? …

python cpython python-2.x python-2.7

4
推荐指数
2
解决办法
102
查看次数