令人困惑的变量范围(来自外部范围的阴影变量)

时间:2017-02-23 14:02:38

标签: python python-3.x scope

我曾经用C,C#和Java编程。现在我已经使用Python了一段时间,但是我遇到了一些理解变量范围的问题,这对我来说非常困惑。例如:

def f1():
    print(spam)   # spam magically come from outer scope. ok...


def f2():
    spam = "bbb"  # assignment shadows variable from outer scope (logical result of f1)
    print(spam)   # printing local spam variable


def f3():
    print(spam)   # ERROR: unresolved reference 'spam'
    spam = "ccc"  # in f1 function everything was fine but adding assignment AFTER
                  # printing (in opposite to f2 function) causes error in line above


def f4():
    print(spam)   # nothing wrong here, assignment line below is commented
    # spam = "ccc"

spam = "aaa"

为什么地球上的功能可以达到范围之外的变量? 为什么外部范围的阴影变量是可以的,但前提是我们之前没有使用它?

1 个答案:

答案 0 :(得分:1)

Python代码在执行前编译为字节代码。这意味着Python可以分析函数如何使用变量。变量是函数中的全局本地,但不是两者都可以更改。

spamf1中是全局的,因为它永远不会被分配。 spam中的f2是本地的,因为它已分配。 f3也是如此。由于spamf3位于spam='ccc'。使用print(spam)语句,您尝试在分配之前访问本地变量。

您可以在函数内使用global spam强制声明变量名称为全局。

当地居住在当地。即使删除了本地命名空间中的变量,Python也不会在父范围中查找名称:

spam = 123

def f():
    spam = 42
    print(spam)  # 42
    del spam
    print(spam)  # UnboundLocalError

f()

如果要分配全局变量,则需要声明它:

spam = 123

def f():
    global spam
    spam = 42
    print(spam)  # 42

f()
print(spam)  # 42