我们就用实际的举例来演示我们今天所要讨论的主要内容。
下面一段代码定义了一个名为generate_new_list_with
的函数。该函数的本意是在每次调用时都新建一个包含有给定element
值的list。而实际运行结果如下:
可见代码运行结果并不和我们预期的一样。list_2
在函数的第二次调用时并没有得到一个新的list并填入2,而是在第一次调用结果的基础上append了一个2。为什么会发生这样在其他编程语言中简直就是设计bug一样的问题呢?
Python变量的实质
要了解这个问题的原因我们先需要一个准备知识,那就是:Python变量到底是如何实现的?
Python变量区别于其他编程语言的申明&赋值方式,采用的是创建&指向的类似于指针的方式实现的。即Python中的变量实际上是对值或者对象的一个指针(简单的说他们是值得一个名字)。我们来看一个例子。
p = 1 p = p+1
对于传统语言,上面这段代码的执行方式将会是,先在内存中申明一个p
的变量,然后将1
存入变量p
所在内存。执行加法操作的时候得到2
的结果,将2
这个数值再次存入到p
所在内存地址中。可见整个执行过程中,变化的是变量p
所在内存地址上的值
上面这段代码中,Python实际上是现在执行内存中创建了一个1
的对象,并将p
指向了它。在执行加法操作的时候,实际上通过加法操作得到了一个2
的新对象,并将p
指向这个新的对象。可见整个执行过程中,变化的是p
指向的内存地址
该贴由system转至本版2019-3-2 21:06:04