353

次のように Python で変数を宣言することは可能ですか?:

var

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

編集:次のような場合にこれを行いたい:

value

for index in sequence:

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

複製

関連している

4

15 に答える 15

438

なぜこれをしないのですか:

var = None

Python は動的なので、宣言する必要はありません。それらは、割り当てられた最初のスコープに自動的に存在します。したがって、必要なのは、上記の通常の古い割り当てステートメントだけです。

初期化されていない変数で終わることはないので、これは素晴らしいことです。ただし、注意してください。これは、誤って初期化された変数で終わらないという意味ではありません。に何かを初期None化する場合は、それが本当に必要なものであることを確認し、可能であればより意味のあるものを割り当ててください。

于 2009-03-19T22:23:05.373 に答える
16

あなたが何をしようとしているのかわからない。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)
于 2009-03-19T22:24:10.643 に答える
3

さて、変数が定義されているかどうかを確認したい場合は、locals()またはglobals()配列にあるかどうかを確認してみませんか?あなたのコードは書き直されました:

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

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

于 2009-11-02T13:00:57.530 に答える
2

あなたの例を正しく理解していれば、if ステートメントで「値」を参照する必要はありません。何かに設定できるようになるとすぐに、ループから抜け出します。

value = None
for index in sequence:
   doSomethingHere
   if conditionMet:
       value = index
       break 
于 2009-03-19T23:04:45.150 に答える
2

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

var = ""

また

var = 0

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

var = Var()
于 2009-03-19T22:24:31.267 に答える
1

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

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

于 2016-11-16T15:59:21.553 に答える
1

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

var = object()

この歩哨はNick Coghlanによって提案されました。

于 2016-10-12T09:13:59.603 に答える
0
var_str = str()
var_int = int()
于 2014-09-12T07:51:37.257 に答える