November 12, 2005
Operation result by-Value or by-Reference [Python]
对一个对象的操作使这个对象有所变化。
这种情况很常见,比如“去除一个list的后三个元素”。
我首先想到的方法是:
>>> a = [1,2,3,4,5,6,7]
>>> a = a[:-3]
>>> a
[1, 2, 3, 4]
>>>
这样的确能使a得到想要的改变,但实际上a“已经不是原来那个a”了。
>>> id(a)
20363584
>>> a = a[:-3]
>>> id(a)
20365224
a所代表的对象已经不同。id函数可以得到对象的标识(identify),从而区别不同对象。
这种情况有时会产生很致命的错误。比如a作为参数传递给一个函数,因为Python的函数参数调用是“引用传值,pass-by-reference”的,所以可能希望函数内对a的操作影响到函数外a对象,这时上面的情况就会发生错误。
正是这个错误耽误了我半天的时间来debug。
针对不同的对象,解决这个的问题方法不同。仅对这里提出的问题做个正解:
>>> a = [1,2,3,4,5,6,7]
>>> id(a)
14198904
>>> del a[-3:]
>>> id(a)
14198904
>>> a
[1, 2, 3, 4]
这个问题的最根本问题其实出在
>>> a = a[:-3]
这句。“=”默认的意思是“赋值,pass the value”,不是传递对象的引用。
Filed by
charlie
at 3:33 pm under Python
