本地和全局之间的Python范围

时间:2017-10-30 21:15:34

标签: python

我有两个样本:

一:

import math

def my_function():
    print(math.pi)
    math.pi = 3
    print(math.pi)

my_function()

输出:

3.141592653589793
3

二:

a = 0

def my_function():
    print(a)
    a = 3
    print(a)

my_function()

输出:

UnboundLocalError: local variable 'a' referenced before assignment

那么他们之间有什么区别?在这种情况下,我认为math.pia都是全局的,它应该生成UnboundLocalError

3 个答案:

答案 0 :(得分:3)

如果在函数内进行变量赋值,则全局变量将被忽略,并且在函数执行期间无法访问,在ServerCall::close(Status,Metadata) lib的示例中,您不会覆盖名称math本身, #39;它为何起作用。下面的Snipped会给你带来与math lib相同的错误:

math

您可以在访问变量之前使用语句global,但如果您稍后将执行任何分配,则会覆盖全局变量,因此最好总是避免这样做

import math

def my_function():
  print(math.pi)
  math = 1

my_function()

答案 1 :(得分:1)

在第一个函数中,变量为math,而不是math.pi。由于您未分配给math,因此它不会成为本地变量。分配给变量的属性与分配给变量本身不是一回事。

如果您将功能更改为

def my_function():
    print(math.pi)
    math = 3
    print(math.pi)

你会得到与第二个函数相同的错误:

  

UnboundLocalError:局部变量' math'在分配前引用

答案 2 :(得分:0)

之前已经回答了几次。

如果函数在该函数内部分配了一个语句,则该变量是函数的本地变量。 在您的实例中,a = 3a定义为函数内的局部变量。第一个print(a)尝试访问它,但尚未分配值。

这就是你看到的原因:

UnboundLocalError: local variable 'a' referenced before assignment.

a = 0创建的全局实例在此处不起作用。