Pythonic Russell的悖论

时间:2017-12-23 22:10:55

标签: python math

在Python中,列表的示例本身是z其中

z = []
z.append(z)
print(z in z)  # True, since z contains a reference to itself

并且列表的示例本身不是w其中

w = [1]
print(w in w)  # False, since w does not contain a reference to itself

假设我们有无限的计算能力和内存。然后我们可以想象无限列表,例如所有偶数正整数的列表,可以定义为以下代码返回的列表a,其中n的限制为无穷大:

n = positive_integer
a = [i for i in range(n) if i%2==0]

我们是否可以类似地定义列表L,在某些限制中,列出所有不在其中的列表?如果是这样,我们似乎会遇到拉塞尔的悖论,它会询问(L in L)是真还是假。例如,如果我们执行以下操作:

n = positive_integer
L = [generate_random_list_not_in_itself() for _ in range(n)]

是否可以实现函数generate_random_list_not_in_itself()的任何可想象的实现都无法捕获不在其中的所有列表,即使在n无限的限制内也是如此?如果是这样,为什么?

注意:我知道Python -- Russell's paradox (lists,not sets)的讨论,但是(据我所知)在这里没有提出相同的问题。

1 个答案:

答案 0 :(得分:4)

Python中的列表与数学中的集合非常不同。这是一个简单的解释,为什么我们不能构造L。

假设我们接受你的约束。 list是一个数组,也就是我们无限内存中某个连续的块。计算机(图灵机)可以真正填充数组的唯一方法是按项目分配。列出其他类型的文字,理解,强制转换 - 最终他们所做的只是分配一块内存并将一些数据复制到其中,然后按块进行分块。

这里我们遇到了一个问题:如果我们允许无限列表,那么有太多,即使你将自己限制在不包含列表以外的项目的列表中也是如此。所有这些列表的集合显然至少是无限的(它包含[][[]][[],[]][[],[],[]],...),但它也是不可数的,因为它还包含“自然数”[[], [[]], [[],[]], ...]及其所有子集的列表。

填充L的过程显然是顺序的(您可以在填充索引时写出索引序列),因此最多可以填充可数量很多的元素,而L是不可数的。从某种意义上说,即使经过了无限的时间,你仍然会留下要添加的项目。

希望这能为Russell悖论为何不适用于Python提供一些见解。