2016-02-23 80 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章,并得到有关可变和不可变类型的更多信息。

相关问题