複数のデータベースを開いてその内容を比較するPythonスクリプトを作成しようとしています。そのスクリプトを作成する過程で、自分が作成したオブジェクトを内容とするリストを作成する際に問題が発生しました。
この投稿のために、プログラムを必要最低限に簡略化しました。まず、新しいクラスを作成し、その新しいインスタンスを作成し、それに属性を割り当ててから、リストに書き込みます。次に、インスタンスに新しい値を割り当て、それをリストに書き込みます...そして何度も何度も...
問題は、それは常に同じオブジェクトなので、実際にはベースオブジェクトを変更しているだけです。リストを読むと、同じオブジェクトが何度も繰り返されます。
では、ループ内のリストにオブジェクトをどのように書き込むのでしょうか。
これが私の簡略化されたコードです
class SimpleClass(object):
pass
x = SimpleClass
# Then create an empty list
simpleList = []
#Then loop through from 0 to 3 adding an attribute to the instance 'x' of SimpleClass
for count in range(0,4):
# each iteration creates a slightly different attribute value, and then prints it to
# prove that step is working
# but the problem is, I'm always updating a reference to 'x' and what I want to add to
# simplelist is a new instance of x that contains the updated attribute
x.attr1= '*Bob* '* count
print "Loop Count: %s Attribute Value %s" % (count, x.attr1)
simpleList.append(x)
print '-'*20
# And here I print out each instance of the object stored in the list 'simpleList'
# and the problem surfaces. Every element of 'simpleList' contains the same attribute value
y = SimpleClass
print "Reading the attributes from the objects in the list"
for count in range(0,4):
y = simpleList[count]
print y.attr1
では、simpleListの要素を(追加、拡張、コピーなど)どのようにして、すべてのエントリが同じオブジェクトを指すのではなく、オブジェクトの異なるインスタンスを含むようにするのでしょうか。