繁体   English   中英

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

[英]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]

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM