Python 为什么del关键字在传递给函数时不删除列表

Python 为什么del关键字在传递给函数时不删除列表,python,pass-by-reference,pass-by-value,Python,Pass By Reference,Pass By Value,在下面的代码中,当我使用del关键字删除形式参数a,然后在函数外部打印它时,传递的列表仍然存在 lst = [1,2,3] def func(a): print lst lst.append(4) #this is modified as it is by default passed by reference print lst print locals del a # this does not delete the lst! why? pri

在下面的代码中,当我使用
del
关键字删除形式参数
a
,然后在函数外部打印它时,传递的列表仍然存在

lst = [1,2,3]
def func(a):
    print lst
    lst.append(4) #this is modified as it is by default passed by reference
    print lst
    print locals
    del a # this does not delete the lst! why?
    print locals
func(a)
print lst #still exists! 

这是一个对象和你用来引用该对象的名称的问题, 您的问题与以下问题非常相似(除了您的问题中的名称位于不同的名称空间中):

a = [1, 2]
b = a
b.append(3)
del b
您认为您删除了列表对象吗?不,另一个领域的类比,外壳

$ echo 1 > a
$ ln a b
$ echo 2 >> b
$ rm b
$ cat a

这是一个对象和你用来引用该对象的名称的问题, 您的问题与以下问题非常相似(除了您的问题中的名称位于不同的名称空间中):

a = [1, 2]
b = a
b.append(3)
del b
您认为您删除了列表对象吗?不,另一个领域的类比,外壳

$ echo 1 > a
$ ln a b
$ echo 2 >> b
$ rm b
$ cat a

因为它删除的是名称,而不是对象。它删除的是名称,但仅在函数内部。您如何调用
func
?这些将有所帮助,因为您已定义
func
,但尚未执行它;-)此外,
dela
remove
a
func
的名称空间中删除,列表对象仍然存在,因为它仍然在main的名称空间中引用。因为它删除的是名称,而不是对象。它确实存在,但仅限于函数内部。如何调用
func
?这些将有帮助,因为您已经定义了
func
,但尚未执行;-)此外,
dela
func
的名称空间中删除
a
,列表对象仍然存在,因为它仍然在main的名称空间中引用。因此,我删除了名称,但没有删除实际的对象!谢谢。所以,我删除了名字,但不是实际的对象!谢谢