9

モジュールから呼び出す関数があります。関数内で、アクセスしようとしている 2 つの変数がグローバルになります。モジュールを IDLE で単独で実行すると、期待どおり、関数の終了後も変数にアクセスできます。モジュールをインポートしたコードで関数を呼び出すと、変数にアクセスできません。

#module to be imported

def globaltest():
    global name
    global age
    name = str(raw_input("What is your name? "))
    age = int(raw_input("What is your age? "))

単独で実行したときの出力。

>>> globaltest()
What is your name? tom
What is your age? 16
>>> name
'tom'
>>> age
16

そしてそれをインポートするコード。

import name_age

name_age.globaltest()

しかし、実行すると、インポートしたコード内の変数にアクセスしようとします。

What is your name? tom
What is your age? 16
>>> name

Traceback (most recent call last):
File "<pyshell#10>", line 1, in <module>
 name
NameError: name 'name' is not defined
>>> 

モジュールをインポートしたコードで変数をグローバルにする方法、または関数の「名前」または「年齢」変数にアクセスするにはどうすればよいですか。

4

3 に答える 3

4

簡単な答えは「しない」です。Python の「グローバル」はモジュール レベルのグローバルのみであり、モジュール レベルのグローバル (変更可能なモジュール レベルのグローバル) でさえ、可能な限り避ける必要があり、それを使用する理由はほとんどありません。

正しい解決策は、関数のパラメーターと戻り値を適切に使用することを学ぶことです。あなたの場合、最初のアプローチは

#module.py

def noglobaltest():
    name = str(raw_input("What is your name? "))
    age = int(raw_input("What is your age? "))
    return name, age 

その後:

from module import noglobaltest

name, age = noglobaltest()
print "name :", name, "age :", age
于 2013-04-10T11:43:44.537 に答える
2

importステートメントを次のように変更するだけです。

from name_age import *

例:

In [1]: from name_age import *
In [2]: print name
Out[2]: 'tom'

それ以外の場合、ステートメントを使用する場合は、モジュール名参照を介して変数import name_ageにアクセスする必要があります。つまり、次のようになります。global

例:

In [1]: import name_age
In [2]: print name_age.name
Out[2]: 'tom'
于 2013-04-10T11:37:23.893 に答える