2017-08-12 88 views

回答

1

考虑下面的情况下,这是一个小版本的你想了解:

def foo(x): 
    x = [] 
    x.append(1) 
    print(x) 

my_list = [] 
foo(my_list) 
print(my_list) 

您所期望的功能foo清除它作为参数收到的名单,之后,通过修改追加号码1,对吧?其实,这不是什么情况......

>>> foo(my_list) 
[1] 
>>> print(my_list) 
[] 

为什么这么说?

因为当你写x = [],而不是清除原来的列表中,你居然改变局部变量x指一个新的列表。另一方面,my_list仍然指的是原始列表!

现在,让我们尝试相同,但使用x[:]代替:

def foo(x): 
    x[:] = [] 
    x.append(1) 
    print(x) 

my_list = [] 
foo(my_list) 
print(my_list) 

现在,一切都应该是你所期望的工作:

>>> foo(my_list) 
[1] 
>>> print(my_list) 
[1] 

x[:]招基本上是告诉译员更换x由一个新的空列表提及。现在,它不是x,它将更改为指向哪个列表。实际上,它仍将引用与my_list相同的列表,并且作为副作用,这将改变原始列表。

为了真正掌握幕后发生的事情,看看how variables are passed by assignment in Python,特别是如果你不熟悉指针的概念。