【问题标题】:Scope in Python [duplicate]Python中的范围[重复]
【发布时间】:2013-06-15 21:56:02
【问题描述】:

我正在使用 Python2.7,但仍然对 Python 中的作用域感到困惑。我无法解释为什么会发生这种情况。有人可以帮助我。提前致谢。

案例一:

x = 1
def func():
    print x

func()

=> 结果:

1

案例2:

x = 1
def func():
    print x
    x = 9
func()

=> 结果:

UnboundLocalError: local variable 'x' referenced before assignment

当我在案例 2 中添加 x = 9 行时,出现错误。

【问题讨论】:

标签: python python-2.7


【解决方案1】:

如果您在方法中重新分配外部变量,您应该使用 global

x = 1
def func():
    global x
    print x
    x = 9
func()

如果是可变变量(如 list 或 dict ),当您只需要修改内部状态( list.append、list.pop )时 - 您不需要 global 关键字。

【讨论】:

  • 不变性与它无关。变量赋值 (x = ...) 总是 以这种方式运行(即创建一个新的本地)。有些操作只能在可变对象上进行,例如项目分配 (x[0] = ...),它们的工作方式不同,但这并不奇怪,因为它们是不同的操作。
  • 在这种情况下,我将 int 视为不可变类型,将 list/dict 视为可变类型。在这种情况下,命名可能不是 100% 准确,但它很好地描述了这种情况,恕我直言。
  • 你的 mutable 和 immutable 的例子基本是对的,我的意思是涉及到的对象是否可变并不重要。也就是说,“不可变”的限定是没有意义的、令人困惑的和过度限制的。无论在func 内部和外部将哪些对象分配给x,OP 都会得到完全相同的错误(试试看——1 和9 带有任意可变对象)。
  • 明白了,将编辑答案。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 2020-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 2019-12-20
  • 1970-01-01
相关资源
最近更新 更多