Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 包含对列表的引用但被引用列表被删除时的变量?_Python_Python 3.x_Reference_Del - Fatal编程技术网

Python 包含对列表的引用但被引用列表被删除时的变量?

Python 包含对列表的引用但被引用列表被删除时的变量?,python,python-3.x,reference,del,Python,Python 3.x,Reference,Del,据我所知,将列表变量分配给变量将创建一个类似于C中指针的引用 >>> l1 = ['joe biden', 'donald trump', 'justin trudeau'] >>> l2 = l1 >>> l1 ['joe biden', 'donald trump', 'justin trudeau'] >>> l2 ['joe biden', 'donald trump', 'justin trudeau'] >

据我所知,将列表变量分配给变量将创建一个类似于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
>>>l1
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“l1”
>>>l2
[“乔·拜登”、“唐纳德·特朗普”、“贾斯汀·特鲁多”、“巴拉克·奥巴马”]
>>>l1.附加(‘奥巴马’)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
NameError:未定义名称“l1”
>>>l2.追加(‘奥巴马’)
>>>l2
[“乔·拜登”、“唐纳德·特朗普”、“贾斯汀·特鲁多”、“巴拉克·奥巴马”、“奥巴马”]
>>> 

l1被删除了,那么l2指向什么呢?似乎l2现在包含了自己的列表。为什么会发生这种情况?

l2指向l1的内存位置,而不是l1。因此,如果删除l1,则l2仍指向相同的列表
del
删除变量,而不是对象。变量
l1
l2
指向同一个列表(更正确的术语是“引用”),您删除了变量
l1
,并保留了变量
l2
。只有当垃圾收集器检测到对象没有剩余引用时,才会删除该对象。另一个
dell2
应该会触发该事件


如果Python允许您删除一个对象,您可能会意外地使用仍然活动的变量或索引来访问一个删除的对象,比如一个悬挂的指针。

那么什么是
del
精确删除呢。或者它不是真的在删除任何东西吗?当对象没有更多的引用时,它将被删除。l2仍然引用列表。@PoweredByCokine您不能。不要再考虑“指针”和“从内存中删除东西”这两个术语了。Python是一种高级语言。考虑对象和对象的名称/引用。@Kritarth这与从内存中删除内容无关。理解Python并不能控制内存管理,这一点非常重要。@poweredbycookine作为旁白,这是许多很好的例子之一,说明了为什么你永远不应该相信W3s编写的任何东西。这是一个可怕的资源,它经常在最基本的事情上有完全错误的信息。不要用它。使用“据我所知,将列表变量指定给变量将创建一个引用,就像C中的指针一样。”将任何内容指定给变量只会创建对某个对象的新引用。Python没有指针,但所有东西都有引用语义。赋值的语义总是相同的,不管涉及到什么类型的对象。注意,Python是一种动态类型语言,变量没有类型,对象有类型请阅读以下内容: