当我在 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 开发人员第一次理解它时,真是大开眼界,并向他们介绍了语言底层机制的美妙之处:-)对我来说是一个真正的顿悟。
