我想在呼叫函式后使用變數“sets”。
我怎樣才能做到這一點?
sets = 0
def search_str(monatsabrechnung, d1):
with open(monatsabrechnung, 'r') as file:
content = file.read()
if lastDay == heute and ja == 1:
sets = 1
else:
pass
search_str(monatsabrechnung, d1)
print(sets)
uj5u.com熱心網友回復:
IIUC,您正在嘗試修改函式中的變數,該變數最初是在函式外部定義的。這是一個變數范圍問題。請查看這篇很棒的文章,以了解變數作用域在 Python 中的作業原理。
回到你的代碼,這里的問題是,即使你運行函式將變數修改sets為 1,python 也會回傳到sets設定為 0 的外部范圍。
sets = 0 #<-- outer scope
def search_str():
... #do something
sets = 1 #<-- inner scope
search_str()
print(sets) #back to outer scope
# 0
解決方案1:作為引數傳遞并回傳
您必須將變數作為引數傳遞給函式,然后按如下方式回傳它 -
sets = 0
def search_str(sets): #<-- pass as paramter
... #do something
sets = 1 #<-- modify
return sets
output = search_str(sets) #<-- save the output
print(output)
# 1
提示:如果您的函式已經回傳另一個輸出,您實際上可以一次回傳、存盤和解壓多個回傳值 -
- 在你的退貨宣告中,退回你需要的一切
return x, y, sets- 然后,在呼叫使用時 -
X, Y, sets = search_str(...)
解決方案 2:將范圍設定為全域
如果傳遞引數并回傳不是您的選擇,則必須將變數的范圍設定為全域 -
sets = 0
def search_str():
global sets #<-- set the scope to global
... #do something
sets = 1
search_str()
print(sets)
# 1
編輯:作為一個額外的指標,正如 Matthias 在他的評論中正確指出的那樣,通常會避免全域范圍,因為如果不小心,它會導致很多問題。
這是一個很棒的 StackOverflow 執行緒,詳細說明了為什么全域變數是邪惡的?
uj5u.com熱心網友回復:
回傳函式的新值sets。如果if陳述句為真,則回傳1,否則回傳與之前相同的值。為了能夠回傳舊值,您應該將其作為引數添加到函式中。
sets = 0
def search_str(monatsabrechnung, d1, sets):
with open(monatsabrechnung, 'r') as file:
content = file.read()
if lastDay == heute and ja == 1:
current_sets = 1
else:
current_sets = sets
return current_sets
sets = search_str(monatsabrechnung, d1, sets)
global如果沒有必要,請不要使用。您會產生副作用并且代碼的可重用性降低。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/536637.html
標籤:Python功能变量
