列出字典Python中的值

时间:2015-03-31 18:52:23

标签: python dictionary

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时,键值对会弹出全局命名空间,而不包含在hash-table结构定义的命名空间中。

有人知道这个的详细原因吗?

3 个答案:

答案 0 :(得分:2)

几个前言

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

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

>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603094424

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

要获得列表的浅表副本,您可以使用[:] as mentioned by Blckknght

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

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

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

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

>>> import copy
>>> n2 = copy.copy(ddic['c'])
>>> id(ddic['c'])
140726603094424
>>> id(n2)
140726603177640

参考

另请注意,正如评论中Kasra所述,dicts没有像它们是数据结构那样单独的空间。您可以在this文档

中找到推荐

答案 1 :(得分:1)

这是Python初学者陷入的经典陷阱。 Python中的某些对象是不可变的(例如整数,字符串,元组)。某些对象是可变的(例如:列表,字典,实例)。

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

如果您不想修改ddic [' c']则必须复制

n2 = list(ddic['c'])
n2[-2] = 1000

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

答案 2 :(得分:1)

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