Python嵌套函数对外部变量的访问权限

3
我想知道为什么引用变量(字典、列表)可以从嵌套函数中访问,而普通对象则不能。
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}

因为整数是不可变的,而列表和字典是可变的,请阅读https://dev59.com/g2sz5IYBdhLWcg3wNU8R。 - Ankit Jaiswal
2个回答

1

整数是不可变的,这意味着当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中作用域的工作原理,并获得关于可变类型和不可变类型的更多信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接