簡體   English   中英

Python是否可以只聲明一個變量而不賦值?

[英]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 的評論(張貼在這里顯示代碼)

與OP的問題無關,但上面的代碼可以重寫為:

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 

如果None是一個有效的數據值,那么您需要以另一種方式訪問該變量。 你可以使用:

var = object()

這個哨兵是由Nick Coghlan建議的。

這是一個很好的問題,不幸的是,因為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM