2017-07-14 108 views
1

我使用的唯一的閱讀從firstline蟒:「with」語句中的變量範圍?

with open(file_path, 'r') as f: 
    my_count = f.readline() 
print(my_count) 

我在變量MY_COUNT的範圍有點糊塗了。雖然打印做工精細,倒不如做一些像my_count = 0 with語句以外的第一(用於例如,關於C中用來做INT my_count = 0

+0

我看到在提供的代碼中沒有'logs_count'。你的意思是'my_count'? – DeepSpace

+0

該代碼是好的,不需要在python的循環外部初始化'my_count' –

回答

5

一個with語句也不是創建範圍(如ifforwhile也不會創建範圍)。

因此,Python將分析代碼並看到您在with語句中進行了賦值,因此這會使變量局部(到實際範圍)。

在Python變量不需要初始化所有代碼路徑:作爲一個程序員,你有責任確保在使用前的變量分配。這可能會導致代碼更短:例如,您確實知道列表中至少包含一個元素,那麼您可以在for循環中進行賦值。在for循環中的Java賦值不被認爲是安全的(因爲循環的主體可能永遠不會被執行)。

初始化with範圍可以在這個意義上更安全的with語句之後,我們可以放心地假設變量存在。另一方面,如果在with語句中指定變量,則在with語句實際上會導致額外檢查之前不對其進行初始化:如果以某種方式在with語句中跳過了分配,Python將會報錯。

A with語句僅用於上下文管理目的。它強制(通過語法)在with中打開的上下文在縮進結束時關閉。

+0

那麼我需要初始化嗎?或者,我可以在with語句之外使用變量my_count,就像我正在做的那樣。什麼會更好的做法? – crystal

+0

@crystal:我用更多的信息更新了答案。這是否回答你的問題? –

+0

感謝您的解釋:D – crystal

1

您還應該通過PEP-343和Python Documentation。它將清楚地表明它不是關於使用Context Manager來創建範圍。我引用上下文管理器上的python文檔

上下文管理器是一個對象,它定義了在執行with語句時要建立的運行時上下文。上下文管理器處理用於執行代碼塊的期望的運行時上下文的入口以及退出。上下文管理器通常使用with語句(在with語句中描述)調用,但也可以通過直接調用它們的方法來使用。上下文管理的

典型用途包括保存和恢復各種全局狀態,鎖定和解鎖資源,關閉打開的文件等