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”,不是传递对象的引用。

No comments yet. Be the first.

Leave a reply

Additional comments powered by BackType

Random posts

  • 被掀翻的蹦蹦车
  • 悲剧
  • 中奖了,PS2
  • 当幸福来敲门 - 择友标准
  • Introduction