不复制或复制其他Python符号

2024-05-29 10:37:53 发布

您现在位置:Python中文网/ 问答频道 /正文

首先:这个问题几乎涵盖了零用例,而且只是关于病态的好奇心。话虽如此:

不久前,我开始怀疑是否可以从Python复制None对象(或任何其他单例,如True或{})。我所说的“复制”,是指创建一个完全不同于同一对象的引用的副本。即:

>>> noneBis == None
True
>>> noneBis is None
False

我之所以认为这是可能的,是因为Python的核心哲学:一切都是一个对象。一个物体可以被复制。在

我试过几种方法(有些比其他方法更复杂),但都做不到:

^{pr2}$

对我来说,这似乎是一个相当顽固和疯狂的科学家证据,但我不确定我是否已经尽力了。(我在Python2.7中对此进行了测试,但是由于Python3+被设计成比Python2更简单,所以我猜结果不会更好。)

你真的可以创建一个单独的Python单例副本吗?


Tags: 对象方法nonefalsetrue核心is副本
1条回答
网友
1楼 · 发布于 2024-05-29 10:37:53

如果你能创建一个单例的“复制副本”,它就不再是一个真正的单例了,是吗?在

wrt/builtin singleton(比如None)是用C实现的(或任何给定实现的语言),我认为除了fork Python或其他类似的极端方法之外,您永远不会期望“克隆”它们。还要注意,由于Python语言规范明确地保证None是一个单例的,所以这不再是Python了;)

现在,如果您想要的是一个singleton并比较等于None,而不是None,下面是一个可能的(python 2.7.x)实现:

def __mknone():
    _instance = [None]

    class NotNoneType(object):
        def __new__(cls):
            if _instance[0] is not None:
                raise TypeError("cannot create 'NotNoneType' instances")
            _instance[0] =  object.__new__(cls)
            return _instance[0]

        def __eq__(self, other):
            if other is None:
                return True
            return other == _instance[0]

        def __nonzero__(self):
            return False

    return NotNoneType()

NotNone = __mknone()
NotNoneType = type(NotNone)
del __mknone

告诉我您是否成功地创建了NotNoneTypeBTW;的另一个实例)

相关问题 更多 >

    热门问题