python嵌套函数对外部变量的可访问性

python nested function's accessibility to outer variable

本问题已经有最佳答案,请猛点这里访问。

我想知道为什么引用变量(dict,list)可以从嵌套函数访问,而简单对象不能访问。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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}


整数是不可变的,这意味着当python执行

1
a=2 inside f()

它创建一个新的本地对象。虽然列表和字典是可变的,所以可以就地修改。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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

使用语句a = 2创建值为2的新局部变量。但是,当您修改b[0]c['c']时,您是在改变全局变量。如果必须处理函数中的可变类型(与局部变量一起使用),则必须在对其进行变异之前初始化相应的变量:

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

请参阅变量和范围一章,其中详细描述了范围如何在Python中工作,并获得有关可变和不可变类型的更多信息。