|
|
|
|
移动端

2.2.10 赋值机制(1)

《自学Python:编程基础、科学计算及数据分析》第2章Python 基础,在本章中,我们将学习Python 语言的基本使用,掌握Python 的基本使用方法,为后续的学习打下基础。本节为大家介绍赋值机制。

作者:李金来源:机械工业出版社|2018-05-03 17:31

技术沙龙 | 邀您于8月25日与国美/AWS/转转三位专家共同探讨小程序电商实战

2.2.10 赋值机制(1)

为了更好地理解 Python中的数据类型,我们需要简单了解 Python的赋值机制。先看一个例子。

假设有一个列表 x,为了不改变列表 x的值,我们将 x“复制”一份给 y,然后对列表 y进行修改:

  1. In [1]: x = [1, 2, 3, 4]   
  2. In [2]: y = x   
  3. In [3]: y[0] = 100 

但是,在这样的操作下,x的值发生了变化:

  1. In [4]: x   
  2. Out[4]: [100, 2, 3, 4] 

这说明赋值并不能实真正的复制效果。为了理解上面的现象,需要从 Python的内部赋值机制开始理解。

1.基本类型的赋值机制

我们先考虑基本类型的赋值机制。

(1)赋值机制分析

来看下面一段代码在Python中的处理流程:

  1. x = 500   
  2. y = x   
  3. y = 'foo' 

执行第一句:x = 500。

将基本类型的值赋给变量时,Python会向系统申请相应的内存空间存储相关的值,然后在命名空间中将变量指向这个内存空间的地址。

Python先向系统申请了一个 PyInt大小的内存用来储存整数对象 500,记该内存的地址为 pos1。接着,Python在命名空间中让变量 x指向内存地址 pos1。

不可变类型一旦创建就不能修改,所以现在内存 pos1中存储的内容是不可变的。内存和命名空间的情况如表 2-4所示。

表 2-4内存和命名空间情况:第 1句

将变量赋给变量时,Python不会创建新的内存来存储变量的值,而是在命名空间中,这两个变量指向同一个内存地址。这里,Python让 y与 x同时指向了 pos1。内存和命名空间的情况如表 2-5所示。

表 2-5内存和命名空间情况:第 2句

字符串是基本类型,Python首先分配了一个地址为 pos2,大小为 PyStr的内存来储存字符串'foo',接着将变量y指向的位置变为pos2。内存和命名空间的情况如表2-6所示。

表 2-6内存和命名空间情况:第 3句

(2)验证分析结果

现在我们来验证这一过程。

在Python中,id()函数可以用来查看一个变量的内存地址,例如之前提到的pos1和pos2:

  1. In [5]: x = 500   
  2. In [6]: id(x)   
  3. Out[6]: 48220272L 

返回的结果表示变量 x现在指向的内存地址的值。

  1. In [7]: y = x   
  2. In [8]: id(y)   
  3. Out[8]: 48220272L 

y和 x的 id值一样,说明 y和 x现在指向了同一块内存地址。

也可以使用关键字is来判断两个变量是不是同一个对象:

  1. In [9]: x is y   
  2. Out[9]: True 

最后让y指向新的内存地址,查看y的地址:

  1. In [10]: y =  'foo'   
  2. In [11]: id(y)   
  3. Out[11]: 39148320L   
  4. In [12]: x is y   
  5. Out[12]: False  

(3)处理值相同的情况

一般来说,Python会为每个出现的对象单独赋值,即使值是一样的:

  1. In [13]: z = 500   
  2. In [14]: id(z)   
  3. Out[14]: 48220296L   
  4. In [15]: x is z   
  5. Out[15]: False  

虽然我们已经有了一个等于 500的值 x,但是 z并不会指向这个现成的值,而是创建了一个新的对象。

不过,为了提高内存利用效率,对于一些简单的对象,比如一些数值较小的整数对象, Python采用了共用内存的办法:

  1. In [16]: x = 2   
  2. In [17]: id(z)   
  3. Out[17]: 6579504L   
  4. In [18]: z = 2   
  5. In [19]: id(z)   
  6. Out[19]: 6579504L   
  7. In [20]: x is z   
  8. Out[20]: True  

2.容器类型的赋值机制

接着,我们来讨论容器类型的赋值机制。

(1)赋值机制分析

以列表为例,分析下面一段代码的执行过程:

  1. x = [500, 501, 502]   
  2. y = x   
  3. y[1] = 600   
  4. y = [700, 800]  

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

标准C++开发入门与编程实践

本书着重介绍标准C++语言,即1998年由ISO正式推出的关于C++的国际性标准版本。 本书从最基础的编程语言概念讲起,共分6篇24章。前4篇完整...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊