关于变量范围的正确性

时间:2010-03-01 22:54:20

标签: python scope

我目前正在用Python开发一些东西,我对变量范围有疑问。

这是代码:

a = None
anything = False
if anything:
    a = 1
else:
    a = 2

print a # prints 2

如果删除第一行(a = None),代码仍然像以前一样工作。但是在这种情况下,我将在“if”块中声明变量,并且对于其他语言(如Java),该变量只能在“if”中可见。

Python中确切的变量范围如何工作以及在这种情况下编程的好方法是什么?

谢谢!

5 个答案:

答案 0 :(得分:8)

根据经验,范围是在三个地方创建的:

  1. 文件范围 - 也称为模块范围
  2. 类范围 - 在class
  3. 中创建
  4. 功能范围 - 在def块内创建
  5. (这些例外有一些例外。)

    分配名称会将其保留在范围名称空间中,标记为未绑定,直到达到第一个分配。因此,对于心智模型,您要为范围中的名称指定值。

答案 1 :(得分:2)

我相信Python使用函数范围来表示局部变量。也就是说,在任何给定的函数中,如果为局部变量赋值,那么从该函数开始,它将在该函数内可用,直到它返回为止。因此,由于您的代码的两个分支都保证分配给a,因此最初无需将None分配给a

请注意,当您还可以访问外部函数中声明的变量时 - 换句话说,Python有闭包。

def adder(first):
    def add(second):
        return first + second

    return add

这定义了一个名为adder的函数。当使用参数first调用时,它将返回一个函数,该函数将收到的任何参数添加到first并返回该值。例如:

add_two = adder(2)
add_three = adder(3)
add_two(4) # = 6
add_three(4) # = 7

但是,尽管您可以从外部函数中读取值,但您无法更改它(与许多其他语言不同)。例如,想象一下尝试实现累加器。您可以编写如下代码:

def accumulator():
    total = 0
    def add(number):
        total += number
        return total
    return add

不幸的是,尝试使用此代码会导致错误消息:

UnboundLocalError: local variable 'total' referenced before assignment

这是因为行total += number尝试更改total的值,而这在Python中无法以这种方式完成。

答案 2 :(得分:1)

if块中分配变量没有问题。

在这种情况下,它被分配在两个分支上,因此您可以看到它在您打印时肯定会被定义。

如果其中一个分支未分配给a,那么当您尝试在该分支之后打印它时会引发NameError异常

答案 3 :(得分:0)

Python最初不需要声明变量,因此您可以在任意点声明和定义。是的,范围是函数范围,因此它将在if之外可见。

答案 4 :(得分:0)

我是一个初学程序员,但据我所知,在python私有变量中不存在。有关详细讨论,请参阅python文档中的private variables

有用的信息也可以在同一页面的“范围和名称空间”部分找到。

就个人而言,我编写的代码就像你每天发布的代码一样,特别是当条件依赖于从用户那里获得输入时,例如

if len(sys.argv)==2:
    f = open(sys.argv[1], 'r')
else:
    print ('provide input file')

我在将变量用于结构化类型之前声明变量,例如我在循环中附加项之前声明一个空列表。

希望它有所帮助。