在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)的讨论,但是(据我所知)在这里没有提出相同的问题。
答案 0 :(得分:4)
Python中的列表与数学中的集合非常不同。这是一个简单的解释,为什么我们不能构造L。
假设我们接受你的约束。 list
是一个数组,也就是我们无限内存中某个连续的块。计算机(图灵机)可以真正填充数组的唯一方法是按项目分配。列出其他类型的文字,理解,强制转换 - 最终他们所做的只是分配一块内存并将一些数据复制到其中,然后按块进行分块。
这里我们遇到了一个问题:如果我们允许无限列表,那么有太多,即使你将自己限制在不包含列表以外的项目的列表中也是如此。所有这些列表的集合显然至少是无限的(它包含[]
,[[]]
,[[],[]]
,[[],[],[]]
,...),但它也是不可数的,因为它还包含“自然数”[[], [[]], [[],[]], ...]
及其所有子集的列表。
填充L的过程显然是顺序的(您可以在填充索引时写出索引序列),因此最多可以填充可数量很多的元素,而L是不可数的。从某种意义上说,即使经过了无限的时间,你仍然会留下要添加的项目。
希望这能为Russell悖论为何不适用于Python提供一些见解。