Python中if语句中的变量作用域

36

在Python中,if语句内部的变量作用域是否可以在if语句外部可见?(我来自Java背景,所以觉得这有点奇怪)

在以下情况下,name首先在if块内定义,但该变量也可以在if块外部可见。我本来期望会出现错误,但是'joe'被打印出来了。

if 1==1:
    name = 'joe'
print(name)
3个回答

72

if语句在Python中不会定义范围。

循环、with语句、try / except等也不会定义范围。

只有模块、函数和类才能定义范围。

请参阅Python教程中的Python作用域和命名空间


哦...抱歉..我对那个错了。 - Owen
@Owen,我猜你在想nonlocal关键字,它并不定义作用域,只是为引用封闭但非全局作用域添加了一种语法。 - agf

2

1

所有在函数中使用的Python变量都存在于函数级别作用域中。 (忽略全局和闭包变量)

这在像这样的情况下非常有用:

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

这样我就不必在if语句之前声明变量了。

你的第一行代码是错误的。如果我在类定义中定义一个变量,它不会在全局作用域、闭包或函数级作用域中。 - agf
@agf - 类并不定义新的作用域——我无法在方法中直接访问类变量(即需要使用Class.thing或者self.thing,而不是仅仅使用thing)。但是它们有自己的命名空间。 - detly
@agf - 其实,现在我想想,我猜你可以从类定义中方法外部访问类变量,所以我不确定那是什么。 - detly
@afg,在类定义中创建的内容与执行函数时存储在本地作用域中相同。该作用域后来成为类字典。但这可能超出了本答案的范围。 - Winston Ewert
@Winston 我理解either是本地作用域,但在编辑之前请先阅读第一行--他明确说“所有[本地]Python变量都存在于函数级别的作用域中”。这是不正确的;除了函数定义之外,还有另一个语句定义了本地作用域--类定义。 - agf
@agf,是的。这就是为什么我进行了编辑的原因。一开始我没有考虑到类,因为我通常不把它们看作变量。 - Winston Ewert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接