web-dev-qa-db-ja.com

Pythonで値を代入しないで変数を宣言することだけが可能ですか?

Pythonで変数を宣言することは可能ですか?

var

それはNoneに初期化されたように? Pythonがこれを許可しているようですが、アクセスするとすぐにクラッシュします。これは可能ですか?そうでない場合、なぜですか?

編集:私はこのような場合にこれをしたいです。

value

for index in sequence:

   if value == None and conditionMet:
       value = index
       break

複製する

関連する

230
Joan Venge

なぜこれをしないでください。

var = None

Pythonは動的なので、物事を宣言する必要はありません。それらは割り当てられた最初のスコープに自動的に存在します。だから、あなたが必要とするのは上のような通常の古い代入文だけです。

初期化されていない変数になることは決してないので、これは素晴らしいことです。しかし、注意してください - これはあなたが誤って初期化された変数で終わらないという意味ではありません。もしあなたがNoneに何かを初期化するなら、それがあなたが本当に欲しいものであることを確かめてください、そして、あなたができるならもっと意味のある何かを割り当ててください。

296
Todd Gamblin

私はあなたが読むことを心からお勧めします 他の言語には「変数」 があります(私は関連リンクとして追加しました)。 Pythonには「変数」ではなく「名前」があります。

val = None
# ...
if val is None:
   val = any_object
54
jfs

あなたが何をしようとしているのかよくわかりません。 Pythonは非常に動的な言語です。実際に変数を代入するか使用するまで、通常は変数を宣言する必要はありません。やりたいことはただ

foo = None

これは、値Nonename__を変数fooname__に代入します。

編集:あなた本当にがやりたいように思われるのはこれだけです:

#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()が例外を発生させた場合、foundname__はバインドされていません。
注:len(sequence)== 0の場合、itemname__はバインド解除されます。

上記のコードはお勧めできません。その目的は、ローカル変数がどのように機能するか、つまり、この場合、実行時にしか「変数」が「定義済み」であるかどうかを判断できるかどうかを示すことです。好ましい方法:

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)
13
kquinn

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で値を代入しないで変数を宣言することしかできないのですか」とあなたが尋ねたことともっと直接的に一致しているようです。

10
Tagar

私は通常、変数をそのような型を表すものに初期化します。

var = ""

または

var = 0

それがオブジェクトになる場合は、インスタンス化するまで初期化しないでください。

var = Var()
4
Andrew Hare

変数が定義されているかどうかを確認したいのであれば、locals()またはglobals()配列にあるかどうかを確認してはどうでしょうか。あなたのコードは書き換えられました:

for index in sequence:
   if 'value' not in globals() and conditionMet:
       value = index
       break

探しているローカル変数の場合は、globals()をlocals()に置き換えます。

3
Johan

まず最初に、あなたが最初に尋ねた質問に対する私の回答

Q:コードのある時点で変数が定義されているかどうかを知るにはどうすればよいですか?

A:その変数が定義されている行が見つかるまでソースファイルを読んでください

しかし、さらに、Pythonicというさまざまな組み合わせがあるというコード例を示しました。あなたは条件にマッチする要素のためにシーケンスをスキャンする方法の後にいるので、ここにいくつかの解決策があります:

def findFirstMatch(sequence):
    for value in sequence:
        if matchCondition(value):
            return value

    raise LookupError("Could not find match in sequence")

明らかにこの例では、達成したいことに応じてraisereturn 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)]
2
Jerub

私があなたの例の権利を理解していれば、とにかくif文で 'value'を参照する必要はありません。あなたはそれが何にでも設定されることができるようになるとすぐにループから抜けています。

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
2
fholo

PythonでCを書き込もうとしているようです。あなたがシーケンスの中で何かを見つけたいのであれば、Pythonはそれを行うための組み込み関数を持っています。

value = sequence.index(blarg)
1
Ken

var = Noneはすでに値を割り当てているので、良い質問であり残念ながら悪い答えです。スクリプトが複数回実行されると、毎回Noneで上書きされます。

代入なしで定義するのと同じではありません。私はまだこの問題を回避する方法を見つけようとしています。

1
zinturis
var_str = str()
var_int = int()
0
Zaur

この醜いonelinerを使ってインタプリタをだますことができますif None: var = Noneそれは初期化ではなく、ローカル変数辞書に変数varを追加すること以外何もしません。後で関数でこの変数を使用しようとすると、InterpreterはUnboundLocalError例外をスローします。これは非常に古くからあるPythonバージョンでもうまくいきます。単純でも美しくもないが、Pythonにはそれほど期待できない。

0
ZAB

Noneが有効なデータ値である場合は、別の方法で変数にアクセスする必要があります。あなたが使用することができます:

var = object()

この歩哨は Nick Coghlan によって示唆されています。

0
Chris_Rands