《流畅的python》阅读笔记 - 第八章:对象引用,可变性和垃圾回收

变量不是盒子

一般我们喜欢把变量比喻成盒子,这样:

a = 12

就理解成把12这个值,放进a这个盒子里,但是更准确的比喻是,变量是一个盒子的标签,比如以上程序可以理解为把12放在一个盒子里,然后给这个盒子贴上标签a

a = [1,2,3]
b = a
a.append(4)
print(b)

这段程序输出了[1,2,3,4],这里我理解的python行为的一种比喻:首先有一个存储了[1,2,3]的盒子,然后把a贴上去。
第2步,把b标签贴到a标签标记的盒子,这样无论是a还是b标签,都贴到了同一个盒子,第3行把a标签标记的盒子再装入一个4,这样b访问b标签的盒子也就收到了改变,这里你可以协助草稿纸来画一个示意图,很好理解,a标记的盒子指的是贴着a标签的盒子。现在我们来讨论另外的一段代码:

a = 12
b = a
a = 24
print(b)

如果按照我们上文的思路,它应该输出24,可事实却不是,a=24这个语句并没有修改到bb的值还是12。我们可以通过以下程序来探究这个问题:

  • 在Cpython中,id指的是对象的地址(Cpython一个解释器,C语言实现的),在python中,一切都是对象。包括一个数字。

All objects in Python has its own unique id. The id is assigned to the object when it is created. The id is the object’s memory address, and will be different for each time you run the program. (except for some object that has a constant unique id, like integers from -5 to 256) —— w3schools

a = 12
print("a = 12    => a 的id为:",id(a))
b = a
print("b = a     => b 的id为:",id(a))
a = 24
print("a = 24    => a 的id为:",id(a))

输出:

a = 12    => a 的id为: 140715159114888
b = a     => b 的id为: 140715159114888
a = 24    => a 的id为: 140715159115272

这里可以看到,a的id(地址)已经改变了,也就是说,把12装到一个盒子里,然后贴上a和b标签,但是后来a标签贴到另外一个盒子去了,所以b标签还是贴着原来值为12的盒子,所以b也就不受a的 改变而改变了。这是python语言的机制,它并不是直接修改第一个盒子的值——至少在这种情况下。

所以,对于一个程序,我们知道哪些行为是容易混乱的,就应该避开它,我想这是好的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值