2

Python でファイルからデータをインポートする際に問題が発生しています。私は Python にまったく慣れていないので、私のエラーはおそらく非常に単純です。

ヘッダーのない 3 列のタブ区切りのテキスト ファイルを読み込んでいます。3 つの異なるデータ ファイルを使用して、データ ファイルの 3 つのインスタンスを作成しています。

各オブジェクトが異なるメモリ位置を参照しているため、それらは分離されていることがわかります。

各インスタンスに保存されているデータを見ると、各インスタンスには同じ内容が含まれており、互いに追加された 3 つのデータファイルで構成されています。

私は何を間違えましたか?

データを読み込むクラスは次のとおりです。

class Minimal:

    def __init__(self, data=[]):
        self.data = data

    def readFile(self, filename):
        f = open(filename, 'r')

        for line in f:
            line = line.strip()
            columns = line.split()
            #creates a list of angle, intensity and error and appends it to the diffraction pattern
            self.data.append( [float(columns[0]), float(columns[1]), float(columns[2])] )
        f.close()

    def printData(self):
        for dataPoint in self.data:
            print str(dataPoint)

データファイルは次のようになります。

1   4   2
2   5   2.3
3   4   2
4   6   2.5
5   8   5
6   10  3

Minimal のインスタンスを実際に作成するために使用しているプログラムは次のとおりです。

from minimal import Minimal

d1 = Minimal()
d1.readFile("data1.xye")

d2 = Minimal()
d2.readFile("data2.xye")

d3 = Minimal()
d3.readFile("data3.xye")


print "Data1"
print d1
d1.printData()

print "\nData2"
print d2
d2.printData()

print "\nData3"
print d3
d3.printData()

出力は次のとおりです。

Data1
<minimal.Minimal instance at 0x016A35F8>
[1.0, 4.0, 2.0]
[2.0, 5.0, 2.3]
[3.0, 4.0, 2.0]
[4.0, 6.0, 2.5]
[5.0, 8.0, 5.0]
[6.0, 10.0, 3.0]
[2.0, 4.0, 2.0]
[3.0, 5.0, 2.3]
[4.0, 4.0, 2.0]
[5.0, 6.0, 2.5]
[6.0, 8.0, 5.0]
[7.0, 10.0, 3.0]
[3.0, 4.0, 2.0]
[4.0, 5.0, 2.3]
[5.0, 4.0, 2.0]
[6.0, 6.0, 2.5]
[7.0, 8.0, 5.0]
[8.0, 10.0, 3.0]

Data2
<minimal.Minimal instance at 0x016A3620>
[1.0, 4.0, 2.0]
[2.0, 5.0, 2.3]
[3.0, 4.0, 2.0]
[4.0, 6.0, 2.5]
[5.0, 8.0, 5.0]
[6.0, 10.0, 3.0]
[2.0, 4.0, 2.0]
[3.0, 5.0, 2.3]
[4.0, 4.0, 2.0]
[5.0, 6.0, 2.5]
[6.0, 8.0, 5.0]
[7.0, 10.0, 3.0]
[3.0, 4.0, 2.0]
[4.0, 5.0, 2.3]
[5.0, 4.0, 2.0]
[6.0, 6.0, 2.5]
[7.0, 8.0, 5.0]
[8.0, 10.0, 3.0]

Data3
<minimal.Minimal instance at 0x016A3648>
[1.0, 4.0, 2.0]
[2.0, 5.0, 2.3]
[3.0, 4.0, 2.0]
[4.0, 6.0, 2.5]
[5.0, 8.0, 5.0]
[6.0, 10.0, 3.0]
[2.0, 4.0, 2.0]
[3.0, 5.0, 2.3]
[4.0, 4.0, 2.0]
[5.0, 6.0, 2.5]
[6.0, 8.0, 5.0]
[7.0, 10.0, 3.0]
[3.0, 4.0, 2.0]
[4.0, 5.0, 2.3]
[5.0, 4.0, 2.0]
[6.0, 6.0, 2.5]
[7.0, 8.0, 5.0]
[8.0, 10.0, 3.0]

Tool completed successfully
4

2 に答える 2

1

次の点を考慮してください。

def d():
   print("d() invoked")
   return 1

def f(p=d())
   pass

print"("Start")
f()
f()

印刷します

d() invoked
Start

いいえ

Start
d() invoked
d() invoked

なんで?デフォルトの引数は関数定義で計算されるためです(そして、後で必要になるたびに再利用するために、ある種の内部グローバルに格納されます)。関数の呼び出しごとに計算されるわけではありません。

言い換えれば、それらは多かれ少なかれ次のように動作します。

_f_p_default= d()
def f(p)
   if p is None: p= _f_p_default
   pass

コードで上記の置換を行うと、すぐに問題を理解できます。

コードの正しい形式は、 @falsetru によって既に提供されています。根拠を説明しようとしているだけです。

于 2013-08-12T03:13:28.573 に答える