列出字典Python中的值

Lists as values in a dictionary Python

本问题已经有最佳答案,请猛点这里访问。
1
2
3
4
5
6
ddic = {'a': 10,'b': 23,'c': [0, 1, 2]}
n2 = ddic['c']
n2[-2] = 1000.

ddic
{'a': 10, 'b': 23, 'c': [0, 1000.0, 2]}

为什么要更改n2指向的列表,还要更改dict ddic的列表,该列表包含在ddic定义的哈希表中?

当您定义dict时,键值对似乎会出现在全局命名空间中,并且不会包含在哈希表结构定义的命名空间中。

有人知道具体原因吗?


很少的预言家

  • dict键是不可变的,而值是可变的。
  • 使用=时,新变量只引用旧列表。

c处的值是一个列表。钥匙指向那个地方。复制到变量时,将传递引用。这可以通过使用id来确认。

1
2
3
4
>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603094424

正如您看到的,两个变量都指向内存中的同一个元素。因此,您在其中所做的任何更改也会反映到原始更改中。

要获得清单的浅显副本,您可以使用BLCKKNGHT提到的[:]

1
>>> n2 = ddic['c'][:]

在python3中,您可以使用(如padraic所述)

1
>>> n2 = ddic['c'].copy()

使用copy模块,可以防止这种情况的发生,如

1
2
3
4
5
6
>>> import copy
>>> n2 = copy.copy(ddic['c'])
>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603177640

参考文献

  • id
  • copy

同样要注意的是,正如kasra在评论中提到的,dict没有数据结构那样的单独空间。您可以在此文档中找到引用


n2是对dict中列表对象的引用,当您访问ddic['c']时,您指向的是dict中的同一列表对象,而不是它的副本。


这是一个经典的Python初学者掉入的陷阱。python中的某些对象是不可变的(例如integer、string、tuple)。有些对象是可变的(例如:列表、字典、实例)。

如果修改可变对象,则引用该对象的所有其他对象都将看到修改后的值。

如果您不想修改DDIC['C'],您必须制作一份副本。

1
2
3
4
5
n2 = list(ddic['c'])
n2[-2] = 1000

ddic
{'a': 10,'b': 23,'c': [0, 1, 2]}