关于python中immutable对象与mutable对象的问题

昨天在写python实现BFS时,遇到了一个问题:

在一个二维列表初始化时,我在stackoverflow上的提问,有一个朋友谈到了这个方法:

G = [[0] * 11] * 11

目的是为了把11*11的二维列表初始化为0,但是这个方法是错了,具体可以看看里面的讨论(链接已经上面给出)。

 

这里就涉及到了Python对对象的处理问题。

在python中,数字1,2,3。。。还有字母a,b,c。。。等都是immutable,所以当一个变量x指向immutable时,然后改变x的值,其实是把x重新指向另外一个immutable或mutable。

比如可以是一下:

>>> x = 1
>>> id(x)
23242456
>>> x = 2
>>> id(x)
23242444
>>>

 

再来看看这个表达式:

G = [[0] * 11] * 11

 

因为0是immutable,所以[0] * 11相当于[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]。

然后[0, 0, 0, 0,0, 0, 0, 0, 0,0, 0] * 11,因为[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]是mutable,意味着这时指向的是同一个,如果修改G[0][0] = 1, 则G[i][0] = 1(0<=i < 11),即同时改变。

 

所以在在上面那个BFS时,用的这个初始化,值搜到第三次就vis全部变成1了,不再搜索。

============================================

(上面貌似写的有问题,再重新写一些)

Python的设计哲学是对指向的对象都是引用的,只不过对于immutable对象,当修改变量时,因为是想的object is immutable,所以是修改指向的地方。而当object is mutable,则是直接修改object。

 

一切都是对对象的操作。。。

 

我在stackoverflow上问了三个问题:

http://stackoverflow.com/questions/10137652/how-to-implement-this-c-source-in-python

http://stackoverflow.com/questions/10149875/the-initialization-of-2-dimensional-array-in-python

http://stackoverflow.com/questions/10151080/the-immutable-object-in-python

 

另外再贴一个链接:

http://www.cnblogs.com/evening/archive/2012/04/11/2442788.html

 

最后唠叨一句:此文勿看,否则会晕,我已经把自己弄晕了,此文只为先mark一下~~~

发布者

Tanky Woo

Tanky Woo,[个人主页:https://tankywoo.com] / [新博客:https://blog.tankywoo.com]

《关于python中immutable对象与mutable对象的问题》有1个想法

发表评论

电子邮件地址不会被公开。 必填项已用*标注