Python: почему мой первоначальный список затрагивается после обновления скопированного списка - PullRequest
2 голосов
/ 28 января 2020
twoSeq=[['28.406925,77.285590', '28.409969,77.292279'],
    ['28.406925,77.285590', '28.402476,77.292956'],
    ['28.409969,77.292279', '28.403020,77.298851'],
    ['28.403020,77.298851', '28.392363,77.306091'],
    ['28.392363,77.306091', '28.378515,77.313990'],
    ['28.378515,77.313990', '28.367469,77.315308'],
    ['28.402476,77.292956', '28.399600,77.297313'],
    ['28.402476,77.292956', '28.397301,77.294096'],
    ['28.399600,77.297313', '28.392247,77.301909'],
    ['28.392247,77.301909', '28.392363,77.306091'],
    ['28.397301,77.294096', '28.399600,77.297313']]

def N_Seq(twoSeq):
    first=twoSeq.copy()
    last=twoSeq.copy()

    for i in range(len(first)):
        first[i].pop(0)
    print(first,"--------")
    for j in range(len(last)): 
        last[j].pop() 
    print(first)
N_Seq(twoSeq)

Выход:

[['28.409969,77.292279'], ['28.402476,77.292956'], ['28.403020,77.298851'], ['28.392363,77.306091'], ['28.378515,77.313990'], ['28.367469,77.315308'], ['28.399600,77.297313'], ['28.397301,77.294096'], ['28.392247,77.301909'], ['28.392363,77.306091'], ['28.399600,77.297313']] --------
[[], [], [], [], [], [], [], [], [], [], []]

Ответы [ 3 ]

4 голосов
/ 28 января 2020

list.copy создает поверхностную копию списка. Это означает, что он создает новый список и вставляет в него ссылки на элементы. В этом случае вы должны использовать copy.deepcopy, который возвращает глубокое копирование.

Из документации:

Разница между мелким и глубоким копированием только релевантно для составных объектов (объектов, которые содержат другие объекты, такие как списки или экземпляры классов):

  • A мелкая копия создает новый составной объект и затем (в той степени, в которой возможно) вставляет ссылки в него на объекты, найденные в оригинале.

  • A глубокая копия создает новый составной объект, а затем рекурсивно , вставляет копии объектов, найденных в оригинале.

2 голосов
/ 28 января 2020

Мелкая копия списка

Мелкая копия копирует только сам список, который является контейнером ссылок на объекты в списке. Если содержащиеся в нем объекты являются изменяемыми и один из них изменяется, это изменение будет отражено в обоих списках.

Глубокая копия

Глубоко скопированный список - это список, полностью отличающийся от оригинала.

import copy
new_list = copy.deepcopy(old_list)

Для ссылка .

0 голосов
/ 28 января 2020
import copy
twoSeq=[['28.406925,77.285590', '28.409969,77.292279'],
['28.406925,77.285590', '28.402476,77.292956'],
['28.409969,77.292279', '28.403020,77.298851'],
['28.403020,77.298851', '28.392363,77.306091'],
['28.392363,77.306091', '28.378515,77.313990'],
['28.378515,77.313990', '28.367469,77.315308'],
['28.402476,77.292956', '28.399600,77.297313'],
['28.402476,77.292956', '28.397301,77.294096'],
['28.399600,77.297313', '28.392247,77.301909'],
['28.392247,77.301909', '28.392363,77.306091'],
['28.397301,77.294096', '28.399600,77.297313']]

def N_Seq(twoSeq):
    first=copy.deepcopy(twoSeq)
    last=copy.deepcopy(twoSeq)

    for i in range(len(first)):
        first[i].pop(0)
    print(first,"--------")
    for j in range(len(last)): 
        last[j].pop() 
    print(first)
N_Seq(twoSeq)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...