2016-07-05 3 views
0

data_entryというオブジェクトの2種類のオブジェクトがあります。time_entryです。Python:オブジェクトの配列内の単一のオブジェクトを変更すると、異なる配列でもすべてが変更されます

data_entry内の配列は次のようになりますtime_entriesの初期化:data_entry

[([time_entry()] * 12) for i in range(5)] 

と初期化が次のようになります。

thing = data_entry() 

、私は "物事" のリストを持って、各これは自身の2次元配列time_entryを含んでいます。

attributes = [] 

私は.extend()を使用して、それを拡張することで、属性を変更:各time_entry

はそうのように初期化され、それの属性の一つとしてリストを持っています。

しかし、私がこれを行うときに実行する問題は、すべて単一のtime_entryのオブジェクトです。data_entryオブジェクトが拡張されます。

オブジェクトの不適切な初期化が原因で発生する可能性があるので、私のオブジェクトの作成が貧弱かどうか、または私が気付いていない別のpythonのクォークがあるかどうか疑問に思っています。

+0

最小の使用例を投稿できますか? –

+0

http://stackoverflow.com/questions/240178/python-list-of-lists-changes-reflected-across-sublists-予期せず –

+0

私はその質問に対する答えが別の問題を解決するのではないかと恐れています。 –

答えて

1

で議論しました。そうであれば、これはリストに載っている結果ではなく、クラスに含まれている結果です。例:

#!/usr/bin/python 

class BedrockDenizen(): 
    attributes = [] 


wilma = BedrockDenizen() 
fred = BedrockDenizen() 

wilma.attributes.extend(['thin', 'smart']) 
fred.attributes.extend(['fat', 'stupid']) 

print 'Wilma:', wilma.attributes 
print 'Fred:', fred.attributes 

フレッドとウィルマの両方が薄く、スマートで、太く、愚かであることがわかります。

ウィルマ:[ '薄い'、 'スマート'、 '脂肪'、 '愚か']

フレッド:[ '薄い'、 'スマート'、 '脂肪'、 '愚か']

その変更に伴い

class BedrockDenizen(): 
    def __init__(self): 
     self.attributes = [] 

、唯一のウィルマは薄くてスマートで、:属性ごとのインスタンスであるように、この問題を解決するために

一つの方法は、のinitメソッドに属性の作成を置くことですdだけフレッドは脂肪と愚かです。

ウィルマ:[ '薄い' 'スマート']

フレッド:[ '脂肪'、 '愚か']

あなたはまた、私たちに多くのコードを表示する必要があるかもしれません。 @バクリュウは、問題はあなたが1つのインスタンスを作成しているだけかもしれないと指摘し、彼は正しいかもしれません。たとえば、これはあなたのコードに近い場合:

class BedrockDenizen(): 
    def __init__(self): 
     self.attributes = [] 

neighborhood = [([BedrockDenizen()] * 2) for i in range(2)] 

flintstones, rubbles = neighborhood 
fred, wilma = flintstones 

wilma.attributes.extend(['thin', 'smart']) 
fred.attributes.extend(['fat', 'stupid']) 

print 'Wilma:', wilma.attributes 
print 'Fred:', fred.attributes 

彼らが本当に別の人ではありませんので、その後フレッドとウィルマは、同じ属性を持っていきます。あなたはより多くのこのようなコードを使用したい場合があります。それはより多くの情報なしで物事の奇妙な方法のように思えるよう

class BedrockDenizen(): 
    def __init__(self): 
     self.attributes = [] 

neighborhood = [[BedrockDenizen() for n in range(2)] for i in range(2)] 

flintstones, rubbles = neighborhood 
fred, wilma = flintstones 

wilma.attributes.extend(['thin', 'smart']) 
fred.attributes.extend(['fat', 'stupid']) 

print 'Wilma:', wilma.attributes 
print 'Fred:', fred.attributes 

、しかし、あなたのニーズが何であるかに依存していること。

+2

**これは、**関連のない、**関連のない問題です。このコードではOPの問題の原因となっている[オブジェクト] *番号は表示されません。 – Bakuriu

+0

@JerryStratton:いいえ、 '[object] * n'は' n'エントリのリストを作成します。これらのエントリはすべて同じオブジェクトです。それは新しいオブジェクトを作成しません。 – user2357112

+0

これは正しいかもしれないと思います。試してみてくださいOP – Anonymous

1

これは、あなたの属性がすべて同じリストオブジェクト内を指しているようです。次に、と同じオブジェクトを毎回延長して修正します。

これは共通の問題であり、あなたがクラスで初期化を実行している場合、それはクラスのすべてのインスタンスに影響を与えます https://docs.python.org/3/faq/programming.html#how-do-i-create-a-multidimensional-listPython list append behavior

関連する問題