【问题标题】:python nested function's accessibility to outer variable [duplicate]python嵌套函数对外部变量的可访问性[重复]
【发布时间】:2016-06-05 00:03:45
【问题描述】:

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

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】:

整数是不可变的,也就是说当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

【讨论】:

    【解决方案2】:

    使用声明a = 2,您正在创建新的局部变量,其值为2。但是,当您修改 b[0]c['c'] 时,您正在改变 全局变量。如果你必须在函数中处理可变类型(像使用局部变量一样使用它们),你必须在改变它之前初始化适当的变量:

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

    请参阅Variables and scope 章节,其中详细描述了作用域在 python 中的工作原理,并获取有关可变和不可变类型的更多信息。

    【讨论】:

      猜你喜欢
      • 2019-06-14
      • 1970-01-01
      • 2018-07-16
      • 2017-07-14
      • 2012-08-12
      • 2018-10-23
      • 1970-01-01
      • 2013-03-31
      • 2011-07-10
      相关资源
      最近更新 更多