第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在“with”語句中聲明的變量是本地的嗎?

在“with”語句中聲明的變量是本地的嗎?

慕田峪9158850 2022-06-02 16:41:08
我正在閱讀 StackOverflow 中的一個問題,其中用戶連續(xù)兩次應(yīng)用“with”語句,將結(jié)果從第一個 with 語句中聲明的變量流水線化到第二個。像這樣(簡單的例子):with open('first_file.txt', 'r') as f:   loaded_file = f.readlines()   #...Prepare a csv file somehow - loaded_file is not declared outside with...with open("second_file.csv", "w") as f:   for line in loaded_file:      f.write(line+"\n")考慮到變量作用域,為什么它會起作用?
查看完整描述

2 回答

?
慕運(yùn)維8079593

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


我希望其他尋找這個原因的人都清楚。


查看完整回答
反對 回復(fù) 2022-06-02
?
30秒到達(dá)戰(zhàn)場

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任何其他特定聲明的本地化。


查看完整回答
反對 回復(fù) 2022-06-02
  • 2 回答
  • 0 關(guān)注
  • 149 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號