2 回答

TA貢獻(xiàn)1876條經(jīng)驗(yàn) 獲得超5個贊
不,“with”語句不會創(chuàng)建新范圍。
“With”語句是 Python 開發(fā)團(tuán)隊(duì)開發(fā)的一種資源,用于概括一種常見的(強(qiáng)烈推薦的)實(shí)踐,即即使在發(fā)生異常后也關(guān)閉打開的資源。想象以下情況:
try:
f = open('file.txt', 'w')
#Do some processing that can raise exceptions and leave 'f' open, eventually locking the file or having trash data loaded into RAM.
#To avoid this situation, a mindful developer will do the following:
finally:
f.close()
它很容易變得冗長。
為了解決這個問題,python 開發(fā)團(tuán)隊(duì)建議使用一些封裝這個過程的dunder方法: __enter__() 和 __exit__() - 當(dāng)你使用“with”語句時,它們會在“幕后”被調(diào)用。
您甚至可以在自己的類中實(shí)現(xiàn)它們!
class controlled_execution:
def __enter__(self):
set things up
return thing
def __exit__(self, type, value, traceback):
tear things down
with controlled_execution() as thing:
some code
最后,即使有標(biāo)識,with 語句也不是單獨(dú)的代碼塊。這只是一個優(yōu)雅的嘗試...finaly 塊。它抽象了一段“包含”的代碼。
這可以通過查看帶有在 try 中聲明的變量的 try...except 語句來輕松理解:
x = 10
try:
y = load_using_failable_function()
z = 5
except FunctionFailureException:
y = 10
#If you treat it properly, there's nothing wrong with doing:
x = x + y + z
我希望其他尋找這個原因的人都清楚。

TA貢獻(xiàn)1828條經(jīng)驗(yàn) 獲得超6個贊
只有一個語句創(chuàng)建了一個新范圍:def
語句。任何其他賦值都會創(chuàng)建一個當(dāng)前函數(shù)體本地的名稱。
例外情況是:
聲明的名稱
global
是指(模塊)全局范圍而不是本地函數(shù)體。聲明
nonlocal
的名稱是指在最近的包含函數(shù)范圍(如果沒有找到其他名稱,則為全局范圍)中定義的名稱Python 解釋器本身可以定義名稱。
在您的示例中,f
是局部變量還是全局變量,具體取決于with
語句發(fā)生的范圍。絕不是f
任何其他特定聲明的本地化。
添加回答
舉報