2017-08-12 36 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,特別是如果你不熟悉指針的概念。

相關問題