2016-02-23 118 views
2

我不知道爲什麼引用變量(dict,list)可以從嵌套函數訪問,而簡單對象則不可以。python嵌套函數對外部變量的可訪問性

In [1]: a = 1 

In [2]: b = [1] 

In [3]: c = {"c" : 1} 

In [4]: 

In [4]: def f(): 
    ...:   a = 2 
    ...:   b[0] = 2 
    ...:   c["c"] = 2 
    ...: 

In [5]: f() 

In [6]: 

In [6]: print a 
1 

In [7]: print b 
[2] 

In [8]: print c 
{'c': 2} 
+0

因爲整數是不可變的,而列表和字典是可變的閱讀http://stackoverflow.com/questions/8056130/immutable-vs-mutable-types-python。 –

回答

1

Integer是不可變的,這意味着當Python執行

a=2 inside f() 

它創建一個新的本地對象。雖然列表和字典是可變的,所以它可以被修改。

>>> a = 0 
>>> id(a) 
31367908 
>>> ls = [1,2] 
>>> id(ls) 
50082760 
>>> def f(): 
    a = 2 
    print id(a) 
    ls[0] = 5 
    print id(ls) 


>>> f() 
31367884 
50082760 
0

隨着a = 2您與價值2創造新局部變量聲明。但是,當您修改b[0]c['c']時,您正在變異全局變量。如果您有功能(與他們的工作與局部變量)來處理可變類型你有變異之前初始化相應的變量:

def f(): 
    c = {} 
    b = [] 
    c['c'] = 2 
    b.append(1) 

請參閱使用的範圍,Python的偉大工程的描述Variables and scope章,並得到有關可變和不可變類型的更多信息。

相關問題