我曾经用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"
为什么地球上的功能可以达到范围之外的变量? 为什么外部范围的阴影变量是可以的,但前提是我们之前没有使用它?
答案 0 :(得分:1)
Python代码在执行前编译为字节代码。这意味着Python可以分析函数如何使用变量。变量是函数中的全局或本地,但不是两者都可以更改。
spam
在f1
中是全局的,因为它永远不会被分配。 spam
中的f2
是本地的,因为它已分配。 f3
也是如此。由于spam
,f3
位于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