该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
不认同你的说法,出现这种原因在于python将int型视为不可变类型。
使用help函数可以看到,官方对字典和列表的copy方法均描述为浅复制,浅复制原理是复制了对象的地址(使用id函数可以观察)。
>>> help(dict.copy)
Help on method_descriptor:
copy(...)
D.copy() -> a shallow copy of D
>>> help(list.copy)
Help on method_descriptor:
copy(...)
L.copy() -> list -- a shallow copy of L
我们对对象中的不可变类型元素进行“修改”时,实际上是将这个元素指向了其他地址。这就是为什么你误解这段代码及其结果:
>>> a[0] = 10
>>> a
[10, 2, [3, 4]]
>>> b
[1, 2, [3, 4]]
我们使用id函数来看看其中的变化:
>>> a = [1, 2, [3, 4]]
>>> b = a.copy()
>>> [id(x) for x in a]
[1384787088, 1384787104, 49367440]
>>> [id(x) for x in b]
[1384787088, 1384787104, 49367440]
可以看到地址相同,确实实现了浅复制。
那当我们“修改”a[0]呢?
>>> a[0] = 10
>>> b
[1, 2, [3, 4]]
>>> [id(x) for x in a]
[1384787232, 1384787104, 49367440]
>>> [id(x) for x in b]
[1384787088, 1384787104, 49367440]
实际上a[0]被指向了新的地址。
现在我们创建一个变量,其值为10,再看看它的地址:
>>> c = 10
>>> id(c)
1384787232
它指向的地址与a[0]相同。现在你知道是什么问题了吗?