在Python字典中作为值列出

2024-09-27 21:34:57 发布

您现在位置:Python中文网/ 问答频道 /正文

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时,键值对会弹出到全局命名空间中,而不会包含在哈希表结构定义的命名空间中。你知道吗

有人知道具体原因吗?你知道吗


Tags: 列表定义空间原因全局结构命名dict
3条回答

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

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

如果你不想修改ddic['c'],你必须复制一份

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

ddic
{'a': 10,'b': 23,'c': [0, 1, 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所提到的,dict没有像数据结构那样的独立空间。您可以在this文档中找到引用

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

相关问题 更多 >

    热门问题