2017-08-02 3 views
0

参考文献と値(this,thisthis)によるリストのコピーに関するいくつかの素晴らしい質問と回答があります。残念ながら、提案された解決策のどれもすべてのネストされた構造からの参照を削除します(... b = a[:]b = list(a)copy.copyを試してみました)。私の最後の希望はcopy.deepcopyでしたが、内部に配列があるときは入れ子構造にはうまくいきません(私はopenpyxlカラムで作業しています)。私は、スタックの一番下に、このエラーを取得する:Python 2では、複雑なネストされた要素のリストを、リストの内容にかかわらず、参照ではなく値でコピーする方法

File "C:\Python27\lib\copy.py", line 257, in _deepcopy_dict 
    y[deepcopy(key, memo)] = deepcopy(value, memo) 
TypeError: unhashable type: 'array.array' 

私の質問です:それは関係なく、aの中にネストされているものの、いずれかの言及なしリストaの完全なコピーを作成することは可能でしょうか?

+1

あなたのエラーは 'deepcopy'に起因するものではありません。むしろ、あなたが 'dict'の' key 'としてそれを使用しようとしているという事実です。 'key'はハッシュ可能型でなければなりません。 – CoryKramer

+0

あなたは '構造全体を一度copy.deepcopy'呼び出し、すべてが再帰的にコピーされます。' B = copy.deepcopyは、(a)は ' –

+0

はまだ、' copy.py'のPythonモジュールは、エラーの原点です。 –

答えて

1

実際、deepcopyは何が必要です。問題は、StyleArrayクラスに__deepcopy__が実装されていないことです。

次の修正プログラムは、仕事をしているようだ:

def __deepcopy__(self, memo): 
    return self.__copy__() 

NB:__copy__はすでに(チェックする)値によってコピーです。

それはまた、あなたのより一般的な質問に答える:ネストされた構造の完全なコピーを作成するために、非標準のネストされた要素は、何らかの形で自分自身をコピーする方法を示さなければなりません。

+0

ありがとうございます!答えと説明のために。私は仕事でそれを確認してみましょう。私は答えとしてマークします。 – Artur

+0

私はcopy'モジュール 'に深く見て、ドキュメントは、このバージョンでは、モジュール、クラス、関数、メソッド、 もスタックトレース、スタックフレーム、またファイル、ソケット、ウィンドウ、また配列のようなタイプをコピーしません'と言う、また どのような類似のタイプでも使用できます。このdeepcopy定義で配列モジュールを変更するのは正しい方法ですか? – Artur

+0

クローンを調べ、何らかの方法でスタイル( 'StyleArray'状態)を変更し、元のものと比較することが良い方法です。私の推測では、 'copy'モジュールはメモリと時間のペナルティーを静かに導入するかもしれないので、デフォルトで配列をコピーしません。とにかく、それが禁止されていることや「間違っている」ことを意味するものではありません。 – YvesgereY

関連する問題