2011-09-12 140 views
20

在Python中,if语句中的变量作用域是否在if语句之外可见? (来自Java背景,所以有点奇怪)if语句中的Python变量范围

在以下情况下,名称首先在if块中定义,但该变量在if块之外也是可见的。我期待一个错误发生,但'乔'被打印。

if 1==1: 
    name = 'joe' 
print(name) 

回答

36

if语句没有在Python中定义范围。

也不做循环,with陈述,try/except

只有模块,函数和类定义范围。

请参阅Python教程中的Python Scopes and Namespaces

+0

@Owen,呃?参考? –

+0

哦......对不起..我错了。 – Owen

+0

@Owen你正在考虑我假设的'nonlocal'关键字,它没有定义范围,只是增加了一个语法来引用一个封闭但非全局的范围。 – agf

1

在函数中使用的所有变量蟒蛇生活在函数级别范围。 (忽略全局和封闭变量)

它是有用的情况下,像这样的:

if foo.contains('bar'): 
    value = 2 + foo.count('b') 
else: 
    value = 0 

这样,我没有if语句前声明变量。

+0

你的第一条线是不正确的。如果我在一个类定义中定义一个变量,它不在全局范围,闭包或函数级范围内。 – agf

+0

@agf - 类没有定义新的作用域 - 我无法从没有限定的方法访问类变量(即,我需要'Class.thing'或'self.thing',而不仅仅是'thing')。不过,他们有自己的命名空间。 – detly

+0

@agf - 实际上,现在我想到了,我想你可以从方法*之外的类定义*中访问类变量,所以我不确定那是什么。 – detly