0

私はpythonの初心者です。以下は私のモジュールです

mymath.py

pi = 3.142

def circle(radius):
    return pi * radius * radius

ターミナルでは、次の方法で実行します。

>>import mymath
>>mymath.pi
>>3.142

pi をローカル変数に変更してリロード (mymath) し、mymath をインポートしても、mymath.pi の値は 3.142 になります。ただし、 mymath.circle(radius) の結果は結果の変化を反映しています。

def circle(radius):
    pi = 3
    return pi * radius * radius

>>import imp
>>imp.reload(mymath)
>>import mymath
>>mymath.pi
>>3.142
>>circle(3)
>>27

何が問題なのか誰にも教えてもらえますか?

4

1 に答える 1

2

のドキュメントからimp.reload()

モジュールが再ロードされると、その辞書 (モジュールのグローバル変数を含む) が保持されます。名前の再定義は古い定義をオーバーライドするため、通常これは問題になりません。モジュールの新しいバージョンが、古いバージョンで定義された名前を定義していない場合、古い定義が残ります。

したがって、モジュールのコードにグローバル名として存在しなくなっimp.reload(mymath)ても、古い定義は更新されたモジュールの一部として残ります。pi

本当にゼロから始めたい場合は、次の方法を使用してください。

import sys
del sys.modules['mymath']
import mymath

例えば:

>>> import os
>>> os.system("echo 'pi = 3.142' > mymath.py")
0
>>> import mymath
>>> mymath.pi
3.142
>>> os.system("echo 'pass' > mymath.py")
0
>>> import sys
>>> del sys.modules['mymath']
>>> import mymath
>>> mymath.pi
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'pi'
于 2013-03-29T18:27:16.520 に答える