2011-09-12 145 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