Мое расширение C изменяет все связанные экземпляры словаря python, даже глубокие копии - PullRequest
0 голосов
/ 21 апреля 2020

Я пытаюсь понять, неправильно ли я понимаю, как должна работать глубокая копия ... любая помощь по этому вопросу приветствуется! У меня есть расширение C, которое изменяет словарь ввода python (это не должно быть, но это другая история). Чтобы сохранить исходные данные, я пытаюсь сделать резервную копию словаря до запуска расширения, но все они изменяются.

// Create lists as input to the dictionary.
>>> seq1 = ['SEQ1','AVWVCCCTAAKKLNN']
>>> seq2 = ['SEQ2','TAARKIQ']

// Create the dictionary
>>> seqdict = {seq1[0]:seq1[1]}
>>> seqdict[seq2[0]]=seq2[1]
>>> seqdict
{'SEQ1': 'AVWVCCCTAAKKLNN', 'SEQ2': 'TAARKIQ'}

// Create my dictionary copies
>>> import copy
>>> deepdict = copy.deepcopy(seqdict)
>>> shallowdict = seqdict.copy()

// As a test, modify my parent dictionary.
// Neither copy is modified with it. 
>>> seqdict['SEQ2']='TAAKKLNN'
>>> seqdict
{'SEQ1': 'AVWVCCCTAAKKLNN', 'SEQ2': 'TAAKKLNN'}
>>> deepdict
{'SEQ1': 'AVWVCCCTAAKKLNN', 'SEQ2': 'TAARKIQ'}
>>> shallowdict
{'SEQ1': 'AVWVCCCTAAKKLNN', 'SEQ2': 'TAARKIQ'}

// Run the C extension that overwrites the sequence. 
// It overwrites certain letters with "N"
>>> from clustalo import clustalo
>>> clustalo(seqdict,seqtype=1)
{'SEQ1': 'ANNNCCCTAANNNNN', 'SEQ2': '-------TAANNNNN'}

// The original dictionary is modified. 
>>> seqdict
{'SEQ1': 'ANNNCCCTAANNNNN', 'SEQ2': 'TAANNNNN'}

// Only the values that were connected to the original dictionary 
// changed within the shallow copy.
>>> shallowdict
{'SEQ1': 'ANNNCCCTAANNNNN', 'SEQ2': 'TAARKIQ'}

// However, the same is observed with the deep copy. Should
// these be unchanged? 
>>> deepdict
{'SEQ1': 'ANNNCCCTAANNNNN', 'SEQ2': 'TAARKIQ'}

Я уверен, что это проблема с моим расширением C, которое я на самом деле не писал (просто портировал на Python3), и я могу поделиться этим кодом, если это поможет. Но подумал, что метод глубокого копирования python не будет так себя вести, и мне было интересно, что я что-то упустил или это какая-то ошибка.

...