内容纲要

最近一道acm题我用python写递归传list结果数组下标越界让我很是郁闷,检查了后发现内层的函数里修改list会导致外层list也被修改。我们知道,python内层函数的变量值该百年却不会导致外层的变量值改变,那为什么list会呢?难道python和C语言一样list是传的指针吗?

我们知道pyhton里本质一切变量都是指针,改变数据值不过是改变指向值的指针。i=0不会把0赋值给i,i=1也不会让i的值改变成1,python里i=0是把0的地址赋给i,而i=1同样是让i从指向0改为指向1的内存空间。

pyhton函数传的是地址,不过不是引用而是传地址值。外层i=0传给内层i,是把外层i指向的地址赋给了内层的i,内层i=1改变了内层i的指向地址而外层i的指向地址不变。

然而对于list,外层i=[1,2,3]传给内层i,是把外层i指向的地址赋给了内层的i,所以内外层i指向的地址是一样的,内层i[0]=4改变了内层i[0]的指向地址,内层i的指向地址是没有变化的,所以外层的i[0]也发生了变化,你操作的是list里的元素,而不是list本身,是不会改变list所在的地址的,两个i指向的是同一个list所以。。。

Leave a Reply

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据