Pythonで変数を宣言することは可能ですか?
var
それはNoneに初期化されたように? Pythonがこれを許可しているようですが、アクセスするとすぐにクラッシュします。これは可能ですか?そうでない場合、なぜですか?
編集:私はこのような場合にこれをしたいです。
value
for index in sequence:
if value == None and conditionMet:
value = index
break
なぜこれをしないでください。
var = None
Pythonは動的なので、物事を宣言する必要はありません。それらは割り当てられた最初のスコープに自動的に存在します。だから、あなたが必要とするのは上のような通常の古い代入文だけです。
初期化されていない変数になることは決してないので、これは素晴らしいことです。しかし、注意してください - これはあなたが誤って初期化された変数で終わらないという意味ではありません。もしあなたがNone
に何かを初期化するなら、それがあなたが本当に欲しいものであることを確かめてください、そして、あなたができるならもっと意味のある何かを割り当ててください。
私はあなたが読むことを心からお勧めします 他の言語には「変数」 があります(私は関連リンクとして追加しました)。 Pythonには「変数」ではなく「名前」があります。
val = None
# ...
if val is None:
val = any_object
あなたが何をしようとしているのかよくわかりません。 Pythonは非常に動的な言語です。実際に変数を代入するか使用するまで、通常は変数を宣言する必要はありません。やりたいことはただ
foo = None
これは、値None
name__を変数foo
name__に代入します。
編集:あなた本当にがやりたいように思われるのはこれだけです:
#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
name__はバインドされていません。
注:len(sequence)== 0の場合、item
name__はバインド解除されます。
上記のコードはお勧めできません。その目的は、ローカル変数がどのように機能するか、つまり、この場合、実行時にしか「変数」が「定義済み」であるかどうかを判断できるかどうかを示すことです。好ましい方法:
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)
Python 3.6以降では、これに変数注釈を使用できます。
https://www.python.org/dev/peps/pep-0526/#abstract
PEP 484は型ヒント、別名型注釈を導入しました。その主な焦点は関数の注釈でしたが、変数に注釈を付けるための型コメントの概念も導入しました。
# 'captain' is a string (Note: initial value is a problem)
captain = ... # type: str
PEP 526は、コメントでそれらを表現するのではなく、変数に型(クラス変数とインスタンス変数を含む)に注釈をつけるための構文をPythonに追加することを目的としています。
captain: str # Note: no initial value!
「Pythonで値を代入しないで変数を宣言することしかできないのですか」とあなたが尋ねたことともっと直接的に一致しているようです。
私は通常、変数をそのような型を表すものに初期化します。
var = ""
または
var = 0
それがオブジェクトになる場合は、インスタンス化するまで初期化しないでください。
var = Var()
変数が定義されているかどうかを確認したいのであれば、locals()またはglobals()配列にあるかどうかを確認してはどうでしょうか。あなたのコードは書き換えられました:
for index in sequence:
if 'value' not in globals() and conditionMet:
value = index
break
探しているローカル変数の場合は、globals()をlocals()に置き換えます。
まず最初に、あなたが最初に尋ねた質問に対する私の回答
Q:コードのある時点で変数が定義されているかどうかを知るにはどうすればよいですか?
A:その変数が定義されている行が見つかるまでソースファイルを読んでください
しかし、さらに、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
を使ってこれを実行する別の方法があります。これは私があなたに見せることを煩わさないでください。
さらに、これを達成するための1行の方法があります。
all_matches = [value for value in sequence if matchCondition(value)]
私があなたの例の権利を理解していれば、とにかくif文で 'value'を参照する必要はありません。あなたはそれが何にでも設定されることができるようになるとすぐにループから抜けています。
value = None
for index in sequence:
doSomethingHere
if conditionMet:
value = index
break
PythonでCを書き込もうとしているようです。あなたがシーケンスの中で何かを見つけたいのであれば、Pythonはそれを行うための組み込み関数を持っています。
value = sequence.index(blarg)
var = None
はすでに値を割り当てているので、良い質問であり残念ながら悪い答えです。スクリプトが複数回実行されると、毎回None
で上書きされます。
代入なしで定義するのと同じではありません。私はまだこの問題を回避する方法を見つけようとしています。
var_str = str()
var_int = int()
この醜いonelinerを使ってインタプリタをだますことができますif None: var = None
それは初期化ではなく、ローカル変数辞書に変数var
を追加すること以外何もしません。後で関数でこの変数を使用しようとすると、InterpreterはUnboundLocalError例外をスローします。これは非常に古くからあるPythonバージョンでもうまくいきます。単純でも美しくもないが、Pythonにはそれほど期待できない。
None
が有効なデータ値である場合は、別の方法で変数にアクセスする必要があります。あなたが使用することができます:
var = object()
この歩哨は Nick Coghlan によって示唆されています。