[英]python- why the list doesn't modified?
>>> c=[1,100,3]
>>>def nullity (lst):
lst=[]
>>>nullity (c)
>>>c
[1,100,3]
为什么c不返回[]? 是不是nullity(c)
意味着c=lst
所以你的两个现在指向[]?
Python具有按值传递的语义,这意味着当您将参数传递给函数时,它会接收对象引用的副本,但不会接收对象本身。 因此,如果您将函数参数重新分配给其他东西(就像您所做的那样),则赋值对于函数是本地的 ,函数“外部”的原始对象保持不变。 如果您更改对象内的某些内容 ,则会发生完全不同的情况:
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中添加), 这里是一个相关的讨论。 但是你可以做同样的效果,它可以在Python 2.x和3.x中使用:
def nullity(lst):
del lst[:]
您将局部变量lst
重新分配给新的空list
。 要清空现有列表,您需要删除其所有成员:
del lst[:]
Python不允许您替换参数。 您只是更改函数中“lst”所指的内容,但它不会影响调用代码。
而是通过清除它来更改列表本身:
def nullity (lst):
lst.clear() # With Python >= 3.3
让我们使用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
在进行重新分配时,会创建一个新的本地对象,该对象与调用该函数时使用的对象不同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.