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

问题描述 投票:0回答:1

我已经玩了一段时间的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)

我的问题在哪里?

先感谢您:)

python numpy
1个回答
1
投票

你需要使用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')
© www.soinside.com 2019 - 2024. All rights reserved.