1
# module1.py

question = "What is the meaning of life, the Universe, and everything?"
answer = 42


# module2.py

question = "What is your quest?"
answer = "To seek the holy grail."




>>> import module1
>>> import module2
>>> print module1.question
What is the meaning of life, the Universe, and everything?
>>> print module2.question
What is your quest?
>>> print module1.answer
42
>>> print module2.answer
To seek the holy grail.

代わりに from module1 import * と from module2 import * を使用した場合、名前の競合が発生し、module1 からの質問と回答にアクセスできなくなります。なぜそうなのですか?

4

2 に答える 2

3

@alexce の例に基づく簡単な例:

>>> pi = 22/7
>>> pi
3

グローバル名前空間で現在定義されている変数:

>>> vars()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', 'pi': 3, '__doc__': None, '__package__': None}

*次に、ベース インポートを行います。

>>> from math import *

古いものを新しいpiものにmath置き換えるpi

>>> pi
3.141592653589793

これで、グローバル名前空間が math モジュールの変数で満たされました。

>>> vars()
{'pow': <built-in function pow>, 'fsum': <built-in function fsum>, 'cosh': <built-in function cosh>, 'ldexp': <built-in function ldexp>, 'hypot': <built-in function hypot>, 'acosh': <built-in function acosh>, 'tan': <built-in function tan>, 'asin': <built-in function asin>, 'isnan': <built-in function isnan>, 'log': <built-in function log>, 'fabs': <built-in function fabs>, 'floor': <built-in function floor>, 'atanh': <built-in function atanh>, 'sqrt': <built-in function sqrt>, '__package__': None, 'frexp': <built-in function frexp>, 'factorial': <built-in function factorial>, 'degrees': <built-in function degrees>, 'pi': 3.141592653589793, 'log10': <built-in function log10>, '__doc__': None, 'asinh': <built-in function asinh>, 'fmod': <built-in function fmod>, 'atan': <built-in function atan>, '__builtins__': <module '__builtin__' (built-in)>, 'copysign': <built-in function copysign>, 'cos': <built-in function cos>, 'ceil': <built-in function ceil>, 'atan2': <built-in function atan2>, 'isinf': <built-in function isinf>, 'sinh': <built-in function sinh>, '__name__': '__main__', 'trunc': <built-in function trunc>, 'expm1': <built-in function expm1>, 'e': 2.718281828459045, 'tanh': <built-in function tanh>, 'radians': <built-in function radians>, 'sin': <built-in function sin>, 'lgamma': <built-in function lgamma>, 'erf': <built-in function erf>, 'erfc': <built-in function erfc>, 'modf': <built-in function modf>, 'exp': <built-in function exp>, 'acos': <built-in function acos>, 'log1p': <built-in function log1p>, 'gamma': <built-in function gamma>}

したがって、このようなインポートは、グローバル名前空間で既に定義されているすべての変数を同じ名前に置き換えます。

ドキュメントから:

*一般に、モジュールまたはパッケージからインポートすることは、読みにくいコードになることが多いため、嫌われていることに注意してください。ただし、対話セッションで入力を節約するために使用してもかまいません。

于 2013-09-01T19:51:54.087 に答える
2
x = 'foo'
x = 'bar'
print x

それが理由です。

于 2013-09-01T19:43:06.483 に答える