Два списка имеют разные адреса памяти, но на них все еще есть ссылки - PullRequest
0 голосов
/ 21 марта 2019

Я некоторое время играл с массивами Python, но недавно я столкнулся со странной проблемой.Вот мой код:

import numpy as np

myarr = [
    ["s"],
    ["s"],
    ["w"],
    ["p"],
    ["m"],
    ["g"],
    ["c"]
]

newarr = list(myarr)
print(id(myarr))
print(id(newarr))

print(myarr, "myarr")
print(newarr, "newarr")
print("##### starting manipulation #########")

for i in newarr:
    i[0] = "a"

print(myarr, "myarr")
print(newarr, "newarr")

Моя проблема даже в том случае, когда я копирую массив "myarr" в новый массив с именем "newarr", когда я делаю некоторые изменения в "myarr" или "newarr"оба они действуют как ссылочные массивы (ссылающиеся на один и тот же адрес памяти), даже если они имеют разные идентификаторы памяти.

Я пробовал это с помощью нарезки или даже метода arr.copy (), но они оба нене работает.

Я могу исправить это только при использовании массива numpy.

newarr = np.array(myarr)

Где моя проблема?

Заранее спасибо:)

1 Ответ

1 голос
/ 21 марта 2019

Вам нужно использовать deepcopy

from copy import deepcopy

myarr = [
    ["s"],
    ["s"],
    ["w"],
    ["p"],
    ["m"],
    ["g"],
    ["c"]
]

newarr = deepcopy(myarr)

print(myarr, "myarr")
print(newarr, "newarr")
print("##### starting manipulation #########")

for i in newarr:
    i[0] = "a"

print(myarr, "myarr")
print(newarr, "newarr")

Выход:

([['s'], ['s'], ['w'], ['p'], ['m'], ['g'], ['c']], 'myarr')
([['s'], ['s'], ['w'], ['p'], ['m'], ['g'], ['c']], 'newarr')
##### starting manipulation #########
([['s'], ['s'], ['w'], ['p'], ['m'], ['g'], ['c']], 'myarr')
([['a'], ['a'], ['a'], ['a'], ['a'], ['a'], ['a']], 'newarr')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...