23

Python では、次の 2 行のコードの違いがよくわかりません。

import X

また

from X import *

どちらもモジュール X からすべてをインポートするだけではありませんか? 違いは何ですか?

4

7 に答える 7

54

の後は、 のようなimport xものを参照できます。の後は、 のように直接参照できます。2 番目の形式は名前をローカル名前空間に直接インポートするため、多数のモジュールからインポートすると競合が発生する可能性があります。したがって、は推奨されません。xx.somethingfrom x import *xsomethingfrom x import *

を行うこともできます。これは、 のすべてではなく、 のみをローカル名前空間にfrom x import somethingインポートします。インポートする名前をリストすると、何をインポートしているかが正確にわかり、名前の競合を回避しやすくなるため、これはより良い方法です。somethingx

于 2012-09-04T20:35:23.347 に答える
14

import XX.var1: これにより、すべてが,X.var2などとしてインポートされます

from X import *var1: これにより、すべてが などとしてインポートされvar2ます。つまり、ローカル名前空間がフラッディングされます。

2 回呼び出した後の違いを確認します。

>>> import math
>>> len(globals())  
5                          #no of variables in namespace
>>> globals()
{'__builtins__': <module '__builtin__' (built-in)>, '__name__': '__main__', '__doc__': None, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '__package__': None}
>>> 
>>>
>>> from math import *
>>> len(globals())
47                     #no of variables in namespace
>>> globals()
{'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, 'math': <module 'math' from '/usr/local/lib/python2.7/lib-dynload/math.so'>, '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>}
于 2012-09-04T20:35:21.133 に答える
6
import X

モジュール オブジェクトを参照するローカル名前空間にラベルを作成します。

from X import *

モジュールのすべてのメンバー属性のラベルをXローカル名前空間に直接作成します。

どちらの演算も , true に加算Xされsys.modulesますが、ローカル名前空間への影響は違います。

于 2012-09-04T20:34:49.453 に答える
3

自分が何をしているのかを本当に理解していない限り、絶対に使用しないでください。from X import *モジュールXから、別のモジュールまたは独自のプログラムのシンボルと競合するシンボルを取得できます。私がその規則に対して持っている唯一の例外は時々from math import *です。

フォームを使用してfrom X import y、モジュールから1つのものを取得できます。

フォームを使用する場合import X、モジュールの使用法を明示的にするだけでなく、モジュールに変更を加えて再インポートする必要がある場合X.yに関数を使用できるようになりました。reload

于 2012-09-04T20:41:13.417 に答える
3

単純なものもあれば、さらに説明が必要なものもあります。

import Xモジュール全体をインポートし(「モジュールを実行する」と読みます)、ローカルスコープで名前を割り当てます。名前は次のようにエイリアスできます。import X as Y

from X import *デフォルトでは、moduleのすべての属性Xをローカル スコープにインポートします。さまざまな使用例を次に示します。

# Assume that module `X` contains an `opendb` function
import X
X.opendb('Y')

# VS.
from X import *
opendb('Y')

これが少し複雑になるのは、モジュールが を定義するときです__all__。これにより、 のセマンティクスが「プロパティにリストされているfrom X import *すべてのものをインポートする」という意味に変更されます。これにより、モジュール作成者は、モジュールからエクスポートされる関数とオブジェクトを制御できます。 __all__

于 2012-09-04T20:35:23.070 に答える
1

from X import *Xモジュールのすべての要素を現在の名前空間に インポートします。import XX をインポートしますが、名前空間を「マージ」しません。例えば:

モジュール X:

def foo(): pass
BAR = 12

あなたのコード:

from X import *
foo() # calls X.foo
print BAR # prints 12

または:

import X
X.foo()
print X.BAR
于 2012-09-04T20:36:24.250 に答える
1

これをモジュール定義の例として使用しましょう

def my_func():
    return 1

from インポートはすべてを現在の名前空間に取り込みます

from X import *
print my_func()

通常のインポートでは、現在の名前空間に X という名前のモジュール オブジェクトが作成されます。

import X
print x.my_func()

さらに、 from X import my_func を使用して、その機能のみをインポートできます。

于 2012-09-04T20:36:59.743 に答える