>>> c=[1,100,3]
>>>def nullity (lst):
lst=[]
>>>nullity (c)
>>>c
[1,100,3]
为什么c不返回[]?不是nullity(c)
意味着c=lst
所以你的双方现在指的是[]?
答案 0 :(得分:5)
Python具有按值传递的语义,这意味着当您将参数传递给函数时,它会接收对象引用的副本,但不会接收对象本身。因此,如果您将一个函数参数重新分配给其他东西(就像您所做的那样),则该函数的赋值是 local ,该函数的“外部”原始对象保持不变。如果您在对象中更改内容,则会发生完全不同的情况:
def test(a):
a[0] = 0
lst = [1, 2, 3]
test(lst)
lst
=> [0, 2, 3]
在上面的代码段中,列表的元素已更改,这是因为lst
和a
都指向完全相同的对象。现在回到最初的问题 - 注意在Python 3.2及以下版本中没有clear()
方法(它在Python 3.3中添加),here是一个相关的讨论。但是你可以做同样的效果,它可以在Python 2.x和3.x中使用:
def nullity(lst):
del lst[:]
答案 1 :(得分:2)
您将局部变量lst
重新分配给新空list
。要清空现有列表,您需要删除其所有成员:
del lst[:]
答案 2 :(得分:1)
Python不允许您替换参数。您只是更改函数中“lst”所指的内容,但它不会影响调用代码。
而是通过清除它来更改列表本身:
def nullity (lst):
lst.clear() # With Python >= 3.3
答案 3 :(得分:1)
让我们使用id()函数
In [14]: c=[1,2,3]
In [15]: def nullity (lst):
...: print id(lst)
...: lst=[]
...: print id(lst)
...:
In [16]: id(c)
Out[16]: 33590520
In [17]: nullity(c)
33590520
33591024
在进行重新分配时,会创建一个新的本地对象,该对象与调用该函数时使用的对象不同。