2014-02-11 71 views
4
>>> c=[1,100,3] 
>>>def nullity (lst): 
    lst=[] 
>>>nullity (c) 
>>>c 
[1,100,3] 

为什么c不返回[]?是不是nullity(c)的意思是c=lst所以你现在都指向[]?python-为什么列表不能修改?

+1

我是唯一一个为什么认为提问者还没有完成他们的作业?它被问了很多次,为什么又是另一个? – erb

+1

我认为这个问题已被多次提出,但在做搜索查询时很难制定。 –

回答

2

您正在将本地变量lst重新分配到新的list。要清空现有列表,您需要删除其所有成员:

del lst[:] 
1

Python不允许您替换参数。你只是在改变函数中的“lst”,但它不影响调用代码。

而是通过清除其更改列表本身:

def nullity (lst): 
    lst.clear() # With Python >= 3.3 
5

Python有传递值语义,这意味着当你传递参数给一个函数,它接收到一个副本对象的引用,但而不是对象本身。所以,如果你重新分配一个函数参数给别的东西(和你一样),赋值为本地的函数,原来的对象“外部”函数保持不变。一个完全不同的情况发生,如果你想改变什么对象:

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[:] 
+0

虽然OP使用[tag:python-3.x],但有可能存在'.clear()'方法(在Python 3.3中实现) –

+0

@MaximeLorant这对我来说是新闻!公平,我更新了我的答案 –

+1

没问题,你现在应该得到upvote :) –

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 

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

相关问题