Python 两个列表具有不同的内存地址,但仍被引用

Python 两个列表具有不同的内存地址,但仍被引用,python,numpy,Python,Numpy,我使用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, "newa

我使用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”进行一些更改时,它们的行为都类似于引用的数组(引用相同的内存地址),即使它们具有不同的内存id

我尝试了切片,甚至是arr.copy()方法,但它们都不起作用

我只能在使用numpy数组时修复它

newarr = np.array(myarr)
我的问题在哪里


提前感谢:)

您需要使用
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')

可能的复制品是浅拷贝,而不是深拷贝。不复制内部列表,只复制外部列表。检查内部列表的id。如果你知道你的数据只有两个级别,你可以很简单地得到一个深度副本。例如:
newarr=[list(xs)For xs in myarr]
。为什么要导入和标记
numpy?您只显示列表。