Skip to main content
 首页 » 编程设计

引用自身的 Python 列表之它是如何工作的

2025年05月04日13emanlee

当我在 python 中使用 = 运算符时,python 会为我创建一个对象(如果它不存在),然后将我的变量链接到它。所以

>>>a = 1 
>>>b = a 
>>>a = 2 
>>>print(f'{a}, {b}')  
2, 1 

好像没问题。对于可变对象,当我改变一个对象时,指针仍然指向同一个对象,所以这也是可以的:

>>>a = [] 
>>>b = a 
>>>a = a.append(1) 
>>>print(f'{a}, {b}')  
[1], [1] 

现在如果我要做那件事会怎样:

>>>a = [1] 
>>>a[0] = a 
>>>print(f'{a}') 

我期待的是无限链接,所以这应该会提供一些错误,但 python 会正常处理它,将 a 描述为 [[...]]。现在我可以访问任何深度的对象 a[0][0][0][0][0],它仍然是 [[...]]。实际上 [1] 应该在内存中的某个地方,但我无法访问它。

好吧,如果我现在做这个东西会发生什么:

>>>a[0][0][0] = 5 

我希望 a 变成 [[[5]]] 或者它自己变成 5(很奇怪,但我可以说它有一定意义)。 实际上,不。 a 变为 [5]。

谁能解释一下为什么?它是如何工作的?

请您参考如下方法:

注解发生了什么(a):

a = [1]    # Creates list object containing 1 and binds a to it. 
a[0] = a   # Changes the first element of that list to bind to a itself. 

在那一点上,a[0]、a[0][0] 和所有其他类似的引用列表的第一个元素,即一个。它是一个自引用绑定(bind),因此您可以根据自己的意愿多次使用它自己。 Douglas Hofstadter 会感到自豪 :-)

所以,现在当你执行 a[0][0][0][0][0] = 5 时,它与执行 a[0] = 5 这确实是你得到的:

>>> a[0][0][0][0] = 5 
>>> a 
[5] 

(a) 这个对象和绑定(bind)行为,当 Python 开发人员第一次理解它时,真是大开眼界,并向他们介绍了语言底层机制的美妙之处:-)对我来说是一个真正的顿悟。