Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Update 126.md #26

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions BasicPython/126.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
#深入变量和引用对象

今天是2014年8月4日,这段时间灾祸接连发生,显示不久前昆山的工厂爆炸,死伤不少,然后是云南地震,也有死伤。为所有在灾难中受伤害的人们献上祷告。
今天是2014年8月4日,这段时间灾祸接连发生,先是不久前昆山的工厂爆炸,死伤不少,然后是云南地震,也有死伤。为所有在灾难中受伤害的人们献上祷告。

在[《永远强大的函数》](./106.md)那一讲中,老齐我(http://qiwsir.github.io)已经向看官们简述了一下变量,之后我们就一直在使用变量,每次使用变量,都要有一个操作,就是赋值。本讲再次提及这个两个事情,就是要让看官对变量和赋值有一个知其然和知其所以然的认识。当然,最后能不能达到此目的,主要看我是不是说的通俗易懂了。如果您没有明白,就说明我说的还不够好,可以联系我,我再为您效劳。

Expand All @@ -19,22 +19,22 @@
File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined

反复提醒:一定要注意看报错信息。如果光光地写一个变量,而没有赋值,那么python认为这个变量没有定义。赋值,不仅仅是给一个非空的值,也可以给一个空值如下,都是允许的
反复提醒:一定要注意看报错信息。如果光光地写一个变量,而没有赋值,那么python认为这个变量没有定义。赋值,不仅仅是给一个非空的值,也可以给一个空值如下,都是允许的

>>> x = 3
>>> lst = []
>>> word = ""
>>> my_dict = {}

在前面讲述中,我提出了一个类比,就是变量通过一根线,连着对象(具体就可能是一个int/list等),这个类比被很多人接受了,算是我老齐的首创呀。那么,如果要用一种严格的语言来描述,变量可以理解为一个系统表的元素,它拥有过指向对象的命名空间。太严肃了,不好理解,就理解我那个类比吧。变量就是存在系统中的一个东西,这个东西有一种能力,能够用一根线与某对象连接,它能够钓鱼。
在前面讲述中,我提出了一个类比,就是变量通过一根线,连着对象(具体就可能是一个int/list等),这个类比被很多人接受了,算是我老齐的首创呀。那么,如果要用一种严格的语言来描述,变量可以理解为一个系统表的元素,它拥有着指向对象的命名空间。太严肃了,不好理解,就理解我那个类比吧。变量就是存在系统中的一个东西,这个东西有一种能力,能够用一根线与某对象连接,它能够钓鱼。

对象呢?展开想象。在机器的内存中,系统分配一个空间,这里面就放着所谓的对象,有时候放数字,有时候放字符串。如果放数字,就是int类型,如果放字符串,就是str类型。

接下来的事情,就是前面说的变量用自己所拥有的能力,把对象和自己连接起来(指针连接对象空间),这就是引用。引用完成,就实现了赋值。

![](../Pictures/12601.png)

看到上面的图了吧,从图中就比较鲜明的表示了变量和对象的关系。所以,严格地将,只有放在内存空间中的对象(也就是数据)才有类型,而变量是没有类型的。这么说如果还没有彻底明白,就再打一个比喻:变量就好比钓鱼的人,湖水里就好像内存,里面有好多鱼,有各种各样的鱼,它们就是对象。钓鱼的人(变量)的任务就是用某种方式(鱼儿引诱)把自己和鱼通过鱼线连接起来。那么,鱼是有类型的,有鲢鱼、鲫鱼、带鱼(带鱼也跑到湖水了了,难道是淡水带鱼?呵呵,就这么扯淡吧,别较真),钓鱼的人(变量)没有这种类型,他钓到不同类型的鱼。
看到上面的图了吧,从图中就比较鲜明的表示了变量和对象的关系。所以,严格地讲,只有放在内存空间中的对象(也就是数据)才有类型,而变量是没有类型的。这么说如果还没有彻底明白,就再打一个比喻:变量就好比钓鱼的人,湖水里就好像内存,里面有好多鱼,有各种各样的鱼,它们就是对象。钓鱼的人(变量)的任务就是用某种方式(鱼儿引诱)把自己和鱼通过鱼线连接起来。那么,鱼是有类型的,有鲢鱼、鲫鱼、带鱼(带鱼也跑到湖水里了,难道是淡水带鱼?呵呵,就这么扯淡吧,别较真),钓鱼的人(变量)没有这种类型,他钓到不同类型的鱼。

这个比喻太烂了。凑合着理解吧。看官有好的比喻,别忘记分享。

Expand Down Expand Up @@ -65,7 +65,7 @@

原来内存中的那个100就做为垃圾被收集了。而且,这个收集过程是python自动完成的,不用我们操心。

那么,python是怎么进行垃圾收集的呢?在[Quora](http://www.quora.com)上也有人问这个问题,我看那个回答很精彩,做个链接,有性趣的读一读吧。[Python (programming language): How does garbage collection in Python work?](http://www.quora.com/Python-programming-language-1/How-does-garbage-collection-in-Python-work)
那么,python是怎么进行垃圾收集的呢?在[Quora](http://www.quora.com)上也有人问这个问题,我看那个回答很精彩,做个链接,有兴趣的读一读吧。[Python (programming language): How does garbage collection in Python work?](http://www.quora.com/Python-programming-language-1/How-does-garbage-collection-in-Python-work)

##is和==的效果

Expand All @@ -77,9 +77,9 @@
这个操作中,l1和l2两个变量,引用的是一个对象,都是[1,2,3]。何以见得?如果通过l1来修改[1,2,3],l2引用对象也修改了,那么就证实这个观点了。

>>> l1[0] = 99 #把对象变为[99,2,3]
>>> l1 #变了
>>> l1 #变了
[99, 2, 3]
>>> l2  #真的变了吔
>>> l2  #真的变了吔
[99, 2, 3]

再换一个方式:
Expand All @@ -92,7 +92,7 @@
>>> l2
[1, 2, 3]

l1和l2貌似指向了同样的一个对象[1,2,3],其实,在内存中,这是两块东西,互不相关。只是在内容上一样。就好像是水里长的一样的两条鱼,两个人都钓到了,当不是同一条。所以,当通过l1修改引用对象的后,l2没有变化。
l1和l2貌似指向了同样的一个对象[1,2,3],其实,在内存中,这是两块东西,互不相关。只是在内容上一样。就好像是水里长的一样的两条鱼,两个人都钓到了,当然不是同一条。所以,当通过l1修改引用对象的后,l2没有变化。

进一步还能这么检验:

Expand All @@ -102,10 +102,10 @@ l1和l2貌似指向了同样的一个对象[1,2,3],其实,在内存中,这
[1, 2, 3]
>>> l1 == l2 #两个相等,是指内容一样
True
>>> l1 is l2 #is 是比较两个引用对象在内存中的地址是不是一样
>>> l1 is l2 #is 是比较两个引用对象在内存中的地址是否一样
False  #前面的检验已经说明,这是两个东东

>>> l3 = l1   #顺便看看如果这样,l3和l1应用同一个对象
>>> l3 = l1   #顺便看看如果这样,l3和l1应是同一个对象
>>> l3
[1, 2, 3]
>>> l3 == l1
Expand Down Expand Up @@ -136,7 +136,7 @@ l1和l2貌似指向了同样的一个对象[1,2,3],其实,在内存中,这
>>> bdict
{'web': 'qiwsir.github.io', 'name': 'qiwsir'}

不过,看官还有小心有点,python不总按照前面说的方式出牌,比如小数字的时候
不过,看官还是要小心点,python不总按照前面说的方式出牌,比如小数字的时候

>>> x = 2
>>> y = 2
Expand Down