[英]Is it possible only to declare a variable without assigning any value in Python?
是否可以像這樣在 Python 中聲明一個變量?:
var
以便它初始化為無? 似乎 Python 允許這樣做,但是一旦您訪問它,它就會崩潰。 這可能嗎? 如果不是,為什么?
編輯:我想為這樣的情況這樣做:
value
for index in sequence:
if value == None and conditionMet:
value = index
break
為什么不這樣做:
var = None
Python是動態的,所以不需要聲明東西; 它們自動存在於分配它們的第一個 scope 中。 因此,您所需要的只是上面的常規舊賦值語句。
這很好,因為你永遠不會得到一個未初始化的變量。 但要小心——這並不意味着你最終不會得到錯誤初始化的變量。 如果您將某些內容初始化為None
,請確保那是您真正想要的,並盡可能分配更有意義的內容。
在 Python 3.6+ 中,您可以為此使用變量注釋:
https://www.python.org/dev/peps/pep-0526/#abstract
PEP 484 引入了類型提示,也就是類型注釋。 雖然它的主要關注點是 function 注釋,但它還引入了類型注釋的概念來注釋變量:
# 'captain' is a string (Note: initial value is a problem)
captain = ... # type: str
PEP 526 旨在為 Python 添加語法以注釋變量的類型(包括 class 變量和實例變量),而不是通過注釋來表達它們:
captain: str # Note: no initial value!
它似乎更直接符合您的要求“是否可以只聲明一個變量而不在 Python 中分配任何值?”
我衷心建議您閱讀其他語言有“變量” (我將其添加為相關鏈接)——在兩分鍾內您就會知道 Python 有“名稱”,而不是“變量”。
val = None
# ...
if val is None:
val = any_object
我不確定你想做什么。 Python 是一種非常動態的語言; 在實際分配或使用變量之前,通常不需要聲明變量。 我想你想做的只是
foo = None
這會將值None
分配給變量foo
。
編輯:你真正想做的就是這樣:
#note how I don't do *anything* with value here
#we can just start using it right inside the loop
for index in sequence:
if conditionMet:
value = index
break
try:
doSomething(value)
except NameError:
print "Didn't find anything"
從這么短的代碼示例中判斷這是否真的是正確的風格有點困難,但它是一種更“Pythonic”的工作方式。
編輯:下面是 JFS 的評論(張貼在這里顯示代碼)
for item in sequence:
if some_condition(item):
found = True
break
else: # no break or len(sequence) == 0
found = False
if found:
do_something(item)
注意:如果some_condition()
引發異常,則found
是未綁定的。
注意:如果 len(sequence) == 0 則item
未綁定。
上面的代碼是不可取的。 其目的是說明局部變量是如何工作的,即“變量”是否“定義”在這種情況下只能在運行時確定。 首選方式:
for item in sequence:
if some_condition(item):
do_something(item)
break
或者
found = False
for item in sequence:
if some_condition(item):
found = True
break
if found:
do_something(item)
好吧,如果您想檢查一個變量是否已定義,那么為什么不檢查它是否在 locals() 或 globals() arrays 中呢? 您的代碼重寫:
for index in sequence:
if 'value' not in globals() and conditionMet:
value = index
break
如果它是您要查找的局部變量,則將 globals() 替換為 locals()。
我通常將變量初始化為表示類型的東西
var = ""
或者
var = 0
如果它將是 object,那么在實例化它之前不要初始化它:
var = Var()
首先,我對您最初提出的問題的回答
問:如何發現變量是否在我的代碼中的某個點定義?
答:在源文件中閱讀,直到看到定義該變量的行。
但更進一步,您已經給出了一個代碼示例,其中有各種非常 Pythonic 的排列。 您正在尋找一種掃描序列以查找匹配條件的元素的方法,因此這里有一些解決方案:
def findFirstMatch(sequence):
for value in sequence:
if matchCondition(value):
return value
raise LookupError("Could not find match in sequence")
顯然,在這個示例中,您可以根據您想要實現的目標將raise
替換為return None
。
如果你想要所有符合條件的東西,你可以這樣做:
def findAllMatches(sequence):
matches = []
for value in sequence:
if matchCondition(value):
matches.append(value)
return matches
還有另一種使用yield
的方法,我不會費心向您展示,因為它的工作方式非常復雜。
此外,有一種方法可以實現這一點:
all_matches = [value for value in sequence if matchCondition(value)]
如果我正確理解了您的示例,則無論如何您都不需要在 if 語句中引用“值”。 只要可以將其設置為任何內容,您就會跳出循環。
value = None
for index in sequence:
doSomethingHere
if conditionMet:
value = index
break
這是一個很好的問題,不幸的是,因為var = None
已經分配了一個值,並且如果您的腳本運行多次,它每次都會被None
覆蓋。
它與沒有賦值的定義不同。 我仍在試圖弄清楚如何繞過這個問題。
是否可以在 Python (var=None) 中聲明一個變量:
def decl_var(var=None):
if var is None:
var = []
var.append(1)
return var
您看起來好像正在嘗試在 Python 中編寫 C。 如果您想在序列中查找某些內容,Python 具有執行此操作的內置函數,例如
value = sequence.index(blarg)
我知道它來晚了,但使用 python3,你可以通過使用聲明一個未初始化的值
uninitialized_value:str
# some code logic
uninitialized_value = "Value"
但是要非常小心這個技巧,因為
uninitialized_value:str
# some code logic
# WILL NOT WORK
uninitialized_value += "Extra value\n"
var_str = str()
var_int = int()
if None: var = None
的話,你可以用這個丑陋的var
來欺騙解釋器: 如果您之后嘗試在 function 中使用此變量,解釋器將拋出 UnboundLocalError 異常。 這也適用於非常古老的 python 版本。 不簡單,也不漂亮,但不要對 python 抱太大期望。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.