Pythonで値を代入せずに変数を宣言することだけは可能ですか?
-
21-08-2019 - |
質問
次のように Python で変数を宣言することは可能ですか?
var
それでNoneに初期化されましたか?Python ではこれが可能のようですが、アクセスするとすぐにクラッシュします。これは可能でしょうか?そうでない場合は、なぜですか?
編集:次のような場合にこれを実行したいと思います。
value
for index in sequence:
if value == None and conditionMet:
value = index
break
重複
- Pythonの初期化されていない値 (同じ作者による)
- Python には宣言キーワードはありますか? (同じ作者による)
関連している
解決
ちょうどこれをしない理由ます:
var = None
Pythonは動的であるので、あなたは物事を宣言する必要はありません。彼らは、彼らが割り当てられている最初の範囲で自動的に存在します。だから、あなたが必要とするすべては、上記のように定期的に古い代入文です。
あなたが初期化されていない変数で終わることは決してないだろうので、これは、いいです。しかし、注意してください - これはあなたがの誤っの初期化された変数で終わるしないことを意味するものではありません。あなたがNone
に何かを初期化した場合、それはあなたが本当に欲しいものだことを確認し、そしてできれば、より意味のあるものを代入します。
他のヒント
ぜひ読んでいただくことをお勧めします 他の言語には「変数」があります (関連リンクとして追加しました) – 2 分で、Python には「変数」ではなく「名前」があることがわかります。
val = None
# ...
if val is None:
val = any_object
私はあなたが何をしようとしてわかりません。 Pythonは非常に動的な言語です。あなたが実際に割り当てるか、またはそれらを使用するつもりまでは通常の変数を宣言する必要はありません。私は何がやりたいことだけだと思います。
foo = None
は変数None
に値foo
が割り当てられます。
EDIT:あなたはを本当にのやりたいように見えるだけで、この次のとおりです。
#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"
それはそれは本当にこのような短いコード例から使用する右のスタイルかどう言うには少し難しいですが、それの仕事をするのより「Python的」な方法です。
編集:以下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)
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(シーケンス)== 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)
Pythonではあなたは、このための変数注釈を使用することができ3.6+ます:
https://www.python.org/dev/peps/pep -0526 /#抽象の
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()
あなたは変数が定義されているかどうかを確認したいかどうさて、なぜならばその地元の人々()またはグローバル()アレイにチェックしていませんか?あなたのコードの書き換えます:
for index in sequence:
if 'value' not in globals() and conditionMet:
value = index
break
それはあなたが探しているローカル変数の場合は、その後、地元の人々(とグローバルを()を置き換えます)。
まず、あなたはもともと求めてきました質問に対する私の回答
の Q:変数は自分のコード内のポイントで定義されている場合はどのように発見しないの
?の A:あなたは、その変数が定義されている行が表示されるまで、ソースファイル内の記事を読むまでの
しかし、さらに、あなたはかなりニシキヘビであることで、様々な置換が存在することのコード例を与えてくれました。あなたは条件に一致する要素のためのシーケンスをスキャンする方法後にしているので、ここでいくつかのソリューションがあります:
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
あなたはPythonでCを書きしようとしているように見えます。あなたが順序で何かを見つけたい場合は、Pythonは
のように、それを行うための組み込み関数を持っていますvalue = sequence.index(blarg)
var = None
が既に値を割り当てているように、それは良い質問と、残念ながら悪い答えで、スクリプトが複数回実行される場合には、毎回None
で上書きされます。
これは、割り当てなし定義と同じではありません。私はまだこの問題を回避する方法を把握しようとしています。
var_str = str()
var_int = int()
None
が有効なデータ値であるなら、あなたは変数に別の方法が必要です。あなたが使用することができます:
var = object()
このセンチネルは、ニック・コフランする noreferrer">
あなたはこの醜いonelinerのif None: var = None
でインタプリタをだますことができます
これは、他に何もしないが、それを初期化しない、ローカル変数辞書に変数var
を追加します。あなたは、その後の機能で、この変数を使用しようとインタプリタはUnboundLocalError例外がスローされます。これはあまりにも非常に古代のpythonのバージョンで動作します。シンプルでも美しいが、パイソンから多くを期待していないわけではありません。