列表值的意外更改

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

即使我只想在列表r中进行更改,为什么此列表v也会被更改?即使它们没有指向相同的内存位置。

r = v = list()
r = [[2,2,1],[2,8,3],[10,2,1],[8,4,2],[4,6,4]]
for c, a in enumerate(r):
    if len(v) > 0:
        v[0][0]=c
        v[0][1]=c
    v.append(a)
print('r',r)
print('v',v)
print(hex(id(r)))
print(hex(id(v)))
python python-3.x list
3个回答
0
投票

将以下两行添加到您的代码中,然后查看输出。

print(hex(id(r[0])))
print(hex(id(v[0])))

我得到的输出是-

('r', [[4, 4, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]])
('v', [[4, 4, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]])
id(r) 0x39ccb48L
id(v) 0x17626c8L
id(r[0]) 0x39cc7c8L
id(r[0]) 0x39cc7c8L

尽管'r'和'v'不同,但r [0]和v [0]指向同一对象。因此,修改v [0]也会修改r [0]。


0
投票

您的代码

>>> id(r) == id(v)
True

替换r,v=[],[]

>>> id(r) == id(v)
False

最好在定义变量后放置条件代码(添加到第2行)


0
投票

v.append(a)将对r的子列表的引用添加到vrv不同,但是它们包含的项目相同。扩展打印以包括子列表,您将看到

r = v = list()
r = [[2,2,1],[2,8,3],[10,2,1],[8,4,2],[4,6,4]]
for c, a in enumerate(r):
    if len(v) > 0:
        v[0][0]=c
        v[0][1]=c
    v.append(a)
print('r',r)
print('v',v)
print(hex(id(r)),[hex(id(i)) for i in r])
print(hex(id(v)),[hex(id(i)) for i in v])

我知道

r [[4, 4, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]]
v [[4, 4, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]]
0x7f7f0d4e8848 ['0x7f7f0d55ff88', '0x7f7f0d55ffc8', '0x7f7f0d38c708', '0x7f7f0d38c648', '0x7f7f0d3a0ac8']
0x7f7f0d3a0c48 ['0x7f7f0d55ff88', '0x7f7f0d55ffc8', '0x7f7f0d38c708', '0x7f7f0d38c648', '0x7f7f0d3a0ac8']

如果您希望列表是独立的,请复制子列表。我所做的只是更改v.append(...)(并删除了不需要的r初始分配)

v = list()
r = [[2,2,1],[2,8,3],[10,2,1],[8,4,2],[4,6,4]]
for c, a in enumerate(r):
    if len(v) > 0:
        v[0][0]=c
        v[0][1]=c
    v.append(a[:])
print('r',r)
print('v',v)
print(hex(id(r)),[hex(id(i)) for i in r])
print(hex(id(v)),[hex(id(i)) for i in v])

哪个给予

r [[2, 2, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]]
v [[4, 4, 1], [2, 8, 3], [10, 2, 1], [8, 4, 2], [4, 6, 4]]
0x7fa258a91848 ['0x7fa258b08f88', '0x7fa258b08fc8', '0x7fa258935748', '0x7fa258935688', '0x7fa258949b08']
0x7fa258949c88 ['0x7fa2589357c8', '0x7fa258a915c8', '0x7fa258949d08', '0x7fa258949d88', '0x7fa258949dc8']
© www.soinside.com 2019 - 2024. All rights reserved.