5

IPython はローカル変数をどのように処理しますか? Python シェルで機能するこの関数がありますが、IPython シェルでは機能しません。

def change(key,value):
    global aname
    global alist
    alist.append(key)
    aname.extend(value)

これをループ内で使用していforます。これは、JSON およびその他の .txt ファイルから入力を読み取り、キーと値をリストに追加してから、別の関数で使用してデータベースに保存します。このようにしないと、醜くなり、ループでインデックスを使用します。

[change(key,value) for key,value in jsondata.itervalues()]

def storeindatabase():
    do_sothing to the list aname and store
    do_sothing to the alist and store
4

2 に答える 2

5

前書き: ここ数か月で、この回答は大幅に反対票を投じられました。私の言葉が少し乱暴に聞こえるかもしれませんが、以下のリンクのドキュメントで説明されているように、グローバルは本当に有害であると主張します。この回答にさらに反対票を投じることを検討している場合は、ドキュメントを読み、以下の内容に同意しない理由を詳しく説明してください。 以下にリンクされている回答を引用すると、「それらが悪い理由は、関数に隠された (明白でなく、驚くべき、検出しにくい) 副作用があり、複雑さが増し、スパゲッティ コードにつながる可能性があるためです。 "

  1. グローバルを使用することは、間違ったエンジニアリングを意味する可能性が非常に高いです。グローバルが必要な場合は、コードを再設計する必要があることを意味します。これは、Python ではさらに当てはまります。
  2. 本当にグローバルを使用したい場合 (おそらく唯一の許容されるケース: シングルトンですが、Python では、シングルトンを使用する場所よりもグローバルにスコープするだけです...)、変数をグローバルとして宣言する必要があります。そしてそれを値にします。

例えば:

global bar
bar = []
def foobar():
    bar.append('X')

RTFM:


IPythonの部分については、私の例はうまくいきます:

In [1]: global bar

In [2]: bar = []

In [3]: def foo():
   ...:     bar.append(3)
   ...:     

In [4]: foo()

In [5]: foo()

In [6]: foo()

In [7]: bar
Out[7]: [3, 3, 3]

これは、外部スコープではなく、グローバルが実際に機能していることを示す別の例です。

In [2]: def foo():
   ...:     global bar
   ...:     bar = []
   ...:     

In [3]: def oof():
   ...:     bar.append('x')
   ...:     

In [4]: foo()

In [5]: oof()

In [6]: oof()

In [7]: oof()

In [8]: oof()

In [9]: bar
Out[9]: ['x', 'x', 'x', 'x']

とにかく、グローバルは悪です!

于 2013-06-04T18:51:09.407 に答える