包含对列表的引用但引用列表被删除时的变量?
Variable Containing Reference to a List but When Referenced List Deleted?
据我了解,将列表变量分配给变量将创建一个引用,就像 C 中的指针一样。
>>> l1 = ['joe biden', 'donald trump', 'justin trudeau']
>>> l2 = l1
>>> l1
['joe biden', 'donald trump', 'justin trudeau']
>>> l2
['joe biden', 'donald trump', 'justin trudeau']
>>> l1.append('barack obama')
>>> l1
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>>
这是预期的。
但事情是这样的:
>>> del l1
>>> l1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'l1' is not defined
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>> l1.append('obama')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'l1' is not defined
>>> l2.append('obama')
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama', 'obama']
>>>
l1被删除,那么l2指的是什么?看起来 l2 现在包含它自己的列表。为什么会这样?
l2 指向 l1 而不是 l1.Hence 的内存位置,如果 l1 被删除你仍然有 l2 指向相同的列表
del
删除变量,而不是对象。变量 l1
和 l2
“指向”(更正确的术语是“引用”)同一个列表,您删除了变量 l1
,并且您有变量 l2
剩下。仅当垃圾收集器检测到该对象没有剩余引用时,该对象才会被删除。进一步 del l2
应该会触发它。
如果 Python 确实允许您删除一个对象,您最终可能会不小心使用仍然存在的变量或索引来访问已删除的对象,例如悬空指针。
据我了解,将列表变量分配给变量将创建一个引用,就像 C 中的指针一样。
>>> l1 = ['joe biden', 'donald trump', 'justin trudeau']
>>> l2 = l1
>>> l1
['joe biden', 'donald trump', 'justin trudeau']
>>> l2
['joe biden', 'donald trump', 'justin trudeau']
>>> l1.append('barack obama')
>>> l1
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>>
这是预期的。
但事情是这样的:
>>> del l1
>>> l1
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'l1' is not defined
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama']
>>> l1.append('obama')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'l1' is not defined
>>> l2.append('obama')
>>> l2
['joe biden', 'donald trump', 'justin trudeau', 'barack obama', 'obama']
>>>
l1被删除,那么l2指的是什么?看起来 l2 现在包含它自己的列表。为什么会这样?
l2 指向 l1 而不是 l1.Hence 的内存位置,如果 l1 被删除你仍然有 l2 指向相同的列表
del
删除变量,而不是对象。变量 l1
和 l2
“指向”(更正确的术语是“引用”)同一个列表,您删除了变量 l1
,并且您有变量 l2
剩下。仅当垃圾收集器检测到该对象没有剩余引用时,该对象才会被删除。进一步 del l2
应该会触发它。
如果 Python 确实允许您删除一个对象,您最终可能会不小心使用仍然存在的变量或索引来访问已删除的对象,例如悬空指针。