python-为什么列表没有修改?

时间:2014-02-11 20:22:21

标签: python python-3.x

>>> c=[1,100,3]
>>>def nullity (lst):
   lst=[]
>>>nullity (c)
>>>c
[1,100,3]

为什么c不返回[]?不是nullity(c)意味着c=lst所以你的双方现在指的是[]?

4 个答案:

答案 0 :(得分:5)

Python具有按值传递的语义,这意味着当您将参数传递给函数时,它会接收对象引用的副本,但不会接收对象本身。因此,如果您将一个函数参数重新分配给其他东西(就像您所做的那样),则该函数的赋值是 local ,该函数的“外部”原始对象保持不变。如果您在对象中更改内容,则会发生完全不同的情况:

def test(a):
    a[0] = 0

lst = [1, 2, 3]
test(lst)
lst
=> [0, 2, 3]

在上面的代码段中,列表的元素已更改,这是因为lsta都指向完全相同的对象。现在回到最初的问题 - 注意在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

在进行重新分配时,会创建一个新的本地对象,该对象与调用该函数时使用的对象不同。