2017-12-29 25 views
-1

誰も私の奇妙な問題で私を助けることができますか?試験ログオンPythonで2つの異なるオブジェクトのデータを複製

https://travis-ci.org/ezored/ezored/jobs/322719711

、私が印刷:

現在のデータ:
線である[ 'フラグ']
[ 'フラグ']

new_target_data.c_flags.extend(['flag']) 

print('Current data:') 
print(target_data.c_flags) 
print(new_target_data.c_flags) 

問題は、"new_target_data.c_flags"を拡張したときです。同じデータが"target_data.c_flags"に適用されます。

https://github.com/ezored/ezored/blob/issue_1/tests/models/test_target.py#L76

誰でもこの問題を理解する:ここで(メソッドtest_merge_target_data)である

<ezored.models.target_data.TargetData object at 0x2b59c0673590> 
<ezored.models.target_data.TargetData object at 0x2b59c0673510> 

テストコードを含むファイル:彼らはあなたがログにメモリ参照を参照することができ、異なるオブジェクトですか?何が間違っている?

+1

これらのアイテムのうち、いずれか1つが他のシャドウコピーである可能性が高いので、これらのアイテムの定義方法を指定してください。 –

+0

こんにちは。それはポストリンク上にあった。フルファイルに移動するにはクリックが必要です。しかし、それはすでに答えられていました。 –

+0

質問で簡単に定義できるものをコードベース全体で調べる必要はありません。質問は自己完結型でなければならないので、私は質問の中にそれらを提供するように頼んだ。 –

答えて

1

あなたは以下のクラスを見つけるだろう、そのコードベースを掘り下げる:ご覧のとおり

class TargetData(object): 
    # ... 
    c_flags = [] 
    # ... 

を、c_flagsはこのクラスのクラス属性です。 new_target_datatarget_dataの両方がこのクラスのインスタンスであり、おそらくc_flagsにアクセスすると、常に同じオブジェクトが生成されます。代わりに、2つのインスタンスMEMの場所を示す、あなたは、あなたが変異している実際のオブジェクトを表示c_flags

print(id(new_target_data.c_flags)) 
print(id(target_data.c_flags)) 

と、あなたは彼らが同じである必要があります表示されます。

+0

あなたは正しい人です。私はここでサンプルを作りました:https://repl.it/repls/GainsboroClutteredXiphiasgladius。このルールはlistとdictに適用されます。 IntegerとStringはインスタンス変数として扱われません。ありがとう。 –

関連する問題