我目前正在用Python开发一些东西,我对变量范围有疑问。
这是代码:
a = None
anything = False
if anything:
a = 1
else:
a = 2
print a # prints 2
如果删除第一行(a = None),代码仍然像以前一样工作。但是在这种情况下,我将在“if”块中声明变量,并且对于其他语言(如Java),该变量只能在“if”中可见。
Python中确切的变量范围如何工作以及在这种情况下编程的好方法是什么?
谢谢!
答案 0 :(得分:8)
根据经验,范围是在三个地方创建的:
class
块def
块内创建(这些例外有一些例外。)
分配名称会将其保留在范围名称空间中,标记为未绑定,直到达到第一个分配。因此,对于心智模型,您要为范围中的名称指定值。
答案 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')
我在将变量用于结构化类型之前声明变量,例如我在循环中附加项之前声明一个空列表。
希望它有所帮助。