2

誰でも次の動作を明確にすることができますか? より大きなコードで遭遇しましたが、最小限の例を作成しました

ファイルuntitled0.pyは次のコードで構成されています。

import numpy as np
class A:
    def f(self,x):
        return np.diag(x)

ファイルuntitled1.pyは次のコードで構成されています。

import untitled0 as u0
import numpy as np
a=u0.A()
print a.f([1])

出力は単純で、[[1]] が画面に出力されます。ここaで、大量の計算作業を行って (A のインスタンス) を作成し、スクリプトの作成を続け、常に再計算したくないとします。私が通常行うことは、単に作成行をコメントアウトすることです (オブジェクト a はとにかく Python シェルに既に存在するため)、つまり:

import untitled0 as u0
import numpy as np
#a=u0.A()
print a.f([1])

ただし、このスクリプトを実行すると、エラーが発生します。

UMD has deleted: untitled0
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\WinPython-64bit-2.7.5.1\python-2.7.5.amd64\lib\site-packages\spyderlib\widgets\externalshell   \sitecustomize.py", line 523, in runfile
    execfile(filename, namespace)
  File "M:\....\untitled1.py", line 12, in <module>
    print a.f([1])
  File "untitled0.py", line 12, in f
    return np.diag(x)
AttributeError: 'NoneType' object has no attribute 'diag'

何らかの理由npで 内で定義されていませんuntitled0.py。誰が何が起こったのか説明できますか?

4

2 に答える 2

1

「UMD has deleted ...」という行がヒントです。Spyder IDE を使用している可能性が高く、この非標準の動作については次の場所で説明しています: Spyder - UMD has deleted: module

追加の問題は、モジュール untitled0.py がアンロード (および再ロード) されたことです。ただし、既存のインスタンスには、モジュールの古いコピーaに存在していたクラスがあります。したがって、そのメソッドは古いバージョンのコードを呼び出します。ここでの問題は、モジュールの古いコピーがガベージ コレクションされたことです。これは、(奇妙なことに) Python がすべてのグローバル名を None に置き換えたことを意味します。これが、検索してしまう理由です--- しかし、この時点では None であるため、クラッシュします。f()np.diag()np

すべてのグローバル変数を None に置き換えるのはなぜですか??? これは非常に古い理由です。参照のサイクルが作成され、むかしむかしそのようなサイクルがメモリ リークを作成していたからです。それ以来、クリーンアップされていません。

問題を回避する方法について具体的なアドバイスができなくて申し訳ありませんが、これで方法と理由を十分に説明できれば幸いです。問題とそれがどのように表示されるかを報告する必要があるSpyderの人たちと、さらに議論を進める必要があると思います.

于 2013-08-26T08:36:25.177 に答える