私はPythonとプログラミング全般(せいぜい数週間)が初めてです。
Pythonおよびモジュールの使用に関して)、from a import *
を使用して関数をインポートできることを認識しています。
入力する代わりに
a.sayHi()
a.sayBye()
私は言うことができます
sayHi()
sayBye()
私はそれが物事を大いに簡素化すると思いますここで、モジュール全体で使用したい変数の束があり、それらすべてを1つのpythonモジュールで定義します。上記のメソッドまたは同様に単純なメソッドで、これらの変数をインポートしますimport a
を使用して、すべての変数の前にa.
を付ける必要はありません。
理想的には、次の状況になります。
a.py
name = "Michael"
age = 15
b.py
some_function
if name == "Michael":
if age == 15:
print("Simple!")
出力:
Simple!
あなたは自分で解決策を与えました:from a import *
は問題なく動作します。 Pythonは、この点で関数と変数を区別しません。
>>> from a import *
>>> if name == "Michael" and age == 15:
... print('Simple!')
...
Simple!
コンテキストのために、ほとんどのリンターはfrom module import *
は警告を発します。名前空間の衝突が起こりやすく、今後の頭痛の種になるからです。
代替案として、あなたは
from a import name, age
フォームを作成し、name
とage
を直接使用します(a.
プレフィックス)。 from [module] import [identifiers]
formは、あるインポートが別のインポートをオーバーライドする時期を簡単に確認できるため、より将来性があります。
また、「変数」は、アドレス指定方法に関してPythonの関数と違いはありません。name
やsayBye
などのすべての識別子はある種のオブジェクトを指す識別子name
は文字列オブジェクトを指し、sayBye
は関数オブジェクトを指し、age
は整数オブジェクトを指します。あなたはPythonに伝えます:
from a import name, age
「モジュールname
内のage
およびa
が指すオブジェクトを取得し、同じ識別子で現在のスコープ内をポイントする」と言っています。
同様に、インポート時に異なる識別子でそれらを指す場合は、使用できます
from a import sayBye as bidFarewell
形。現在のスコープではそれを指す識別子がbidFarewell
であるのに対し、モジュールa
ではそれを指す識別子がsayBye
であることを除いて、同じ関数オブジェクトが指し示されます。
他の人が言ったように、
from module import *
モジュール変数もインポートします。
ただし、あなたはnot変数をインポートするだけで、オブジェクトへの参照であることを理解する必要があります。インポートするモジュールのインポートされた名前に他の何かを割り当てると、他のモジュールに影響しますwo n't。
例:次のコードを含むモジュールmodule.py
があると仮定します。
a= 1
b= 2
次に、他の2つのモジュールmod1.py
とmod2.py
があり、どちらも以下を実行します。
from module import *
各モジュールでは、a
とb
の2つの名前が作成され、それぞれオブジェクト1
と2
を指しています。
さて、mod1.py
のどこかにグローバル名a
に何か他のものを割り当てた場合:
a= 3
module.py
の名前a
とmod2.py
の名前a
は、引き続きオブジェクト1
を指します。
したがって、読み取り専用グローバルが必要な場合はfrom module import *
は機能しますが、読み取り/書き込みグローバルが必要な場合は機能しません。後者の場合は、import module
をインポートしてから、値(module.a
)を取得するか、モジュールのプレフィックスが付いた値(module.a= …
)を設定する方が良いでしょう。
これを直接言ったわけではありませんが、これらのグローバル変数の操作に問題があると思われます。
関数内からグローバル変数を操作する場合は、グローバル変数を宣言する必要があります
a = 10
def x():
global a
a = 15
print a
x()
print a
そうしないと、a = 15
はローカル変数を作成して15を割り当てるだけで、グローバルaは10のままです。