2

私はPythonが初めてで、特にデバッグのために、グローバル変数を使用してデザインを簡単に制御しています。

これが私のコードです:

hidNow = -1
def loginFromSql(br, n=0):
    global hidNow
    print hidNow
    hidNow = 5566
    print hidNow
print(hidNow)

そして、「from myModule import *」で直接pythonを実行します

関数を呼び出す前に、print hidNow は -1 の結果を取得しますが、関数が呼び出されても -1 のままです....

Pythonのバグですか?私はpython 2.7.5を使用しています

ありがとう!

4

3 に答える 3

6

を行う場合、インポートを行う場所でfrom myModule import *呼び出される変数を作成します。この新しい変数は、内部hidNowとは別のものです。最初は同じ値ですが、内部から新しい値を割り当てても、既にインポートした値は変更されません。hidNowmyModulehidNowmyModule

*1 つの解決策は、インポートを使用しないことです。代わりに次のようにします。

import myModule
print myModule.hidNow
myModule.loginFromSql()
print myModule.hidNow # will change

(これは私があなたが求めていることだと思いますが、あなたの質問とコードは不明確なので、これがあなたが得ているものでない場合は編集して修正してください。)

グローバル変数を使用してこの情報を保存する理由を考える必要があります。グローバル変数は脆弱です。

于 2013-10-29T19:52:31.317 に答える
2

特にデバッグのために、デザインを簡単に制御するためにグローバル変数を使用しています。

クリッピー

実際の問題を詳しく説明し (別の回答で原因が既に指摘されているため)、このXY 問題の X 部分に対処します。

モジュール レベルでのグローバル変数の使用は通常は必要なく、多くの Python 開発者にはコードの匂いとして現れるでしょう。

状態を維持するためのより良い方法は、次のようなクラスを使用することです。

# myModule.py
class Thing(object):

  def __init__(self, hidNow=-1):
    self.hidNow = hidNow

  def loginFromSql(self, br, n=0):
    self.hidNow = 5566

ここに、この属性のアクセス方法が表示され、値の変更が行われることがわかります。

>>> from myModule import *
>>> my_thing = Thing()
>>> my_thing.hidNow
-1
>>> my_thing.loginFromSql('potato')
>>> my_thing.hidNow
5566
于 2013-10-29T20:24:04.977 に答える
0

loginFromSql を定義しましたが、呼び出していません。これは、少し余分な印刷と関数の呼び出しを含むスクリプトの例です。

hidNow = -1
def loginFromSql(br, n=0):
    global hidNow
    print "login start", hidNow
    hidNow = 5566
    print "login done", hidNow

print "before call", hidNow
loginFromSql('x')
print "after call", hidNow

実行すると、この出力が得られ、グローバルが変更されることが示されます

before call -1
login start -1
login done 5566
after call 5566
于 2013-10-29T20:18:39.407 に答える