2024-09-27 21:34:57 发布
网友
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时,键值对会弹出到全局命名空间中,而不会包含在哈希表结构定义的命名空间中。你知道吗
有人知道具体原因吗?你知道吗
这是一个经典的陷阱Python初学者陷入。 Python中的某些对象是不可变的(例如整数、字符串、元组)。有些对象是可变的(例如:列表、字典、实例)。你知道吗
如果修改可变对象,则引用该对象的所有其他对象都将看到修改后的值。你知道吗
如果你不想修改ddic['c'],你必须复制一份
n2 = list(ddic['c']) n2[-2] = 1000 ddic {'a': 10,'b': 23,'c': [0, 1, 2]}
很少有婚前夫妇
=
键c处的值是一个列表。钥匙指向那个地方。复制到变量时,会传递引用。这可以通过使用id来确认。你知道吗
c
id
>>> id(ddic['c']) 140726603094424 >>> id(n2) 140726603094424
如您所见,这两个变量都指向内存中的同一个元素。因此,您在其中所做的任何更改也会反映到原来的更改。你知道吗
要获得列表的浅表副本,可以使用[:]as mentioned by Blckknght
[:]
>>> n2 = ddic['c'][:]
在python3中,可以使用(如Padraic所述)
>>> n2 = ddic['c'].copy()
使用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对象,而不是它的副本。你知道吗
n2
ddic['c']
这是一个经典的陷阱Python初学者陷入。 Python中的某些对象是不可变的(例如整数、字符串、元组)。有些对象是可变的(例如:列表、字典、实例)。你知道吗
如果修改可变对象,则引用该对象的所有其他对象都将看到修改后的值。你知道吗
如果你不想修改ddic['c'],你必须复制一份
很少有婚前夫妇
=
时,新变量只引用旧列表键
c
处的值是一个列表。钥匙指向那个地方。复制到变量时,会传递引用。这可以通过使用id
来确认。你知道吗如您所见,这两个变量都指向内存中的同一个元素。因此,您在其中所做的任何更改也会反映到原来的更改。你知道吗
要获得列表的浅表副本,可以使用
[:]
as mentioned by Blckknght在python3中,可以使用(如Padraic所述)
使用
copy
模块,您可以像中一样防止这种情况发生参考
还要注意的是,正如注释中的Kasra所提到的,dict没有像数据结构那样的独立空间。您可以在this文档中找到引用
n2
是对dict中list对象的引用。当您访问ddic['c']
时,您指向的是dict中的同一list对象,而不是它的副本。你知道吗相关问题 更多 >
编程相关推荐