相关疑难解决方法(0)

绑定和未绑定方法对象的id() - 有时对于不同的对象是相同的,有时对于同一对象是不同的

我已经尝试了一些关于绑定和未绑定方法的代码.当我们调用它们时,我认为它们都会返回对象.但是当我id()用来获取一些信息时,它会返回一些我不理解的东西.

IDE:Eclipse

插件:pydev

Class C(object):
    def foo(self):
        pass

cobj = C()

print id(C.foo)    #1
print id(cobj.foo) #2

a = C.foo
b = cobj.foo

print id(a)        #3
print id(b)        #4
Run Code Online (Sandbox Code Playgroud)

输出是......

5671672

5671672

5671672

5669368
Run Code Online (Sandbox Code Playgroud)

为什么#1和#2返回相同的ID?它们不是不同的对象吗?如果我们分配C.fooconj.foo两个变量,#3和#4返回不同的id.

我认为#3和#4表明它们不是同一个对象,但#1和#2 ......

绑定方法的id和未绑定方法有什么区别?

python methods object

29
推荐指数
2
解决办法
5569
查看次数

为什么CPython中的id({})== id({})和id([])== id([])?

为什么CPython(没有关于其他Python实现的线索)有以下行为?

tuple1 = ()
tuple2 = ()                                                                                                   
dict1 = {}
dict2 = {}
list1 = []
list2 = []
# makes sense, tuples are immutable
assert(id(tuple1) == id(tuple2))
# also makes sense dicts are mutable
assert(id(dict1) != id(dict2))
# lists are mutable too
assert(id(list1) != id(list2))
assert(id(()) == id(()))
# why no assertion error on this?
assert(id({}) == id({}))
# or this?
assert(id([]) == id([]))
Run Code Online (Sandbox Code Playgroud)

我有一些想法可能,但找不到具体原因.

编辑

进一步证明格伦和托马斯的观点:

[1] id([])
4330909912
[2] x = []
[3] …
Run Code Online (Sandbox Code Playgroud)

python identity cpython python-internals

26
推荐指数
2
解决办法
1787
查看次数

为什么方法没有引用相等?

我有一个错误,我在使用时依赖于彼此相等的方法is.事实证明并非如此:

>>> class What(object):
    def meth(self):
        pass

>>> What.meth is What.meth
False
>>> inst = What()
>>> inst.meth is inst.meth
False
Run Code Online (Sandbox Code Playgroud)

为什么会这样?它适用于常规功能:

>>> def func():
    pass

>>> func is func
True
Run Code Online (Sandbox Code Playgroud)

python methods identity equality reference

14
推荐指数
1
解决办法
821
查看次数