python-变量不是盒子

作者: localhost 分类: Python 发布时间: 2018-06-07 11:04

变量是盒子?

很多语言都会有“变量是盒子”的比喻,例如C语言,初始化一个变量的时候通常是开辟了一段新的内存空间来存放,但是“变量是盒子”的比喻却有碍于理解面向对象语言(例如java,python等)中的引用式变量。本文通过几个小示例来进行举例说明。

Some Gizmo

  • 示例1 变量a和b对值的内存地址进行引用
In [46]: a = 3
In [47]: b = a
In [48]: id(a)
Out[48]: 39545192L
In [49]: id(b)
Out[49]: 39545192L
In [50]: a = 4
In [51]: id(a)
Out[51]: 39545168L
In [52]: id(b)
Out[52]: 39545192L
In [53]: b
Out[53]: 3
解释: 1.a变量赋值给b,此时a和b的内存地址是一样的说明a、b“标签”针对3这个值的内存地址进行引用 2.重新为a进行赋值4,a对4的内存地址重新进行引用,因此a的内存地址发生了改变,b任然对3的内存地址引用所以没发生改变
  • 示例2 变量a和b对引用变量的内存地址进行引用
In [30]: a = [1, 2, 3]
In [31]: b = a
In [32]: id(a)
Out[32]: 78485768L
In [33]: id(b)
Out[33]: 78485768L
In [34]: a.append(4)
In [35]: b
Out[35]: [1, 2, 3, 4]
In [36]: id(a)
Out[36]: 78485768L
In [37]: id(b)
Out[37]: 78485768L
解释: a赋值列表变量[1, 2, 3],a赋值给b,此时a和b同时引用变量[1,2,3](可变的引用变量)的内存地址(不是值的内存地址) a追加元素4,此时引用变量[1, 2, 3]的值改变为[1, 2, 3, 4],但是内存地址并没改变,所以a和b的引用地址没发生改变

总结

在python中不可变对象包括元组,值类型(字符串,字符等),可变对象包括列表,字典等。在不可变对象赋值的时候,变量(标签)往往是对值内存地址进行引用,在可变对象赋值的时候,变量是对可变对象的引用地址进行引用。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注