百科问答小站 logo
百科问答小站 font logo



这个python代码为什么输出9个9? 第1页

  

user avatar   programus 网友的相关建议: 
      

这就是没学懂过C语言就开始学其他计算机语言,常常可能遇到的问题。

再碰上学的教材或者教的老师不靠谱亦或是自己没有努力思考,就很难搞懂了。

其实,现有的很多答案已经解答了这个疑问,但是,我很怀疑提问者的水平是否能理解那些答案说的意思。所以,我在这里多此一举再加一个答案,希望尽可能浅显易懂一些说明一下。


进入正题之前,为了方便别人阅读,先把你的问题代码用代码块重新贴一下。毕竟Python这种注重缩进的语法,题目描述中的代码直接就会报错了。

       l = [] a = {"num": 0} for i in range(10):     a["num"] = i     l.append(a) print (l)     

另外,再纠个错,也有其他人说过了,结果应该是10个 9 ,还希望提问人仔细数数,毕竟这是学前班就应该掌握好的能力。如果实在不好数,下次别用 10 可以考虑用 3 或者 5

然后,先给你一个简单的解决方案:

       l = [] for i in range(10):     a = {"num": 0}     a["num"] = i     l.append(a) print (l)     

这样就可以得到你想要的了。

       [{'num': 0}, {'num': 1}, {'num': 2}, {'num': 3}, {'num': 4}, {'num': 5}, {'num': 6}, {'num': 7}, {'num': 8}, {'num': 9}]      


为什么呢?

因为Python里面的变量并不是本体,而是对本体的引用 (reference) 。

好吧……这句话太专业了,我们换个通俗的说法。你想象Python里面变量的本体是后宫三千佳丽,那么,变量是啥呢?变量就是皇上拿来翻的牌子。你想临幸哪个胴体……不对,是变量的本体,你就翻哪个牌子。

既然是牌子,那理论上对应同一个美人,可以有好几个牌子。一个放在平时的皇宫中,一个放在某地临时行宫里,一个放在避暑山庄……这都不是问题。换句话说,牌子本身的复制并不会让美人变多。换回专业的说法,就是一个对象可以同时有多个引用,引用的复制并不影响实际对象。

回到问题里的程序上——

上来第一行,你弄了个坚挺的胸前挂着很多口袋可以装牌子的美人—— l,对,Python里的 list只能装牌子,永远不可能装本体。

接着,第二行你弄了个美人 {"num": 0} ,安排了一个可以临幸她的牌子 a (其实,牌子叫啥不重要)。

       +-----+ |  a  +--------> {"num": 0} +-----+     

接下来,你把下面的事情干了10次:

临幸牌子 a 对应的美人,把她身上某个部位上印着的那个数字改成你临幸她的次数(从 0开始计数)。(话说,怎么有点变态的感觉呢?)

然后,临幸美人 l,把a这个牌子给她,让她按顺序收好,这时候美人l会复制一个牌子揣自己口袋里。

大概画一下示意图,就是这样的:箭头代表牌子对应的是哪个美人。

第0次

       +-----+ |  a  +--------> {"num": 0} +-----+             ^                     | +-----+             | |  l  |             | +--+--+             |    |                |    v                | +======+            | | l[0] +------------+ +======+     

第1次

       +-----+ |  a  +--------> {"num": 1} +-----+             ^                     | +-----+             | |  l  |             | +--+--+             |    |                |    v                | +======+            | | l[0] +------------+ +------+            | | l[1] +------------+ +======+     

第2次

       +-----+ |  a  +--------> {"num": 2} +-----+             ^                     | +-----+             | |  l  |             | +--+--+             |    |                |    v                | +======+            | | l[0] +------------+ +------+            | | l[1] +------------+ +------+            | | l[2] +------------+ +======+     

…………

第10次

       +-----+ |  a  +--------> {"num": 9} +-----+             ^                     | +-----+             | |  l  |             | +--+--+             |    |                |    v                | +======+            | | l[0] +------------+ +------+            | | l[1] +------------+ +------+            | | l[2] +------------+ +------+            | | l[3] +------------+ +------+            | | l[4] +------------+ +------+            | | l[5] +------------+ +------+            | | l[6] +------------+ +------+            | | l[7] +------------+ +------+            | | l[8] +------------+ +------+            | | l[9] +------------+ +======+     


这个时候,你把 l这个牌子交给画师( print ),让他把你的美人的样子弄出来示众,画师找到 l对应的美人,发现她是个挺挺的胸脯前挂着一排口袋的美人,对这种美人的默认操作,是画一对

       (.)(.)     

不对!应该是画一对方括号!

       []     

然后把口袋里的牌子逐个翻出来,照着牌子把对应的美人一个一个画出来,放在方括号中间。

所以,这个画师,按照牌子顺序,一次次叫出已经被你蹂躏成了 {"num": 9}的美人,画了她10次。

于是,你就看到了10个9。


那么,我后来改了之后的程序是什么样的呢?

这次把弄一个美人的语句放在循环里面了,所以,你做了10次的事情不再是在一个美人身上动手动脚10次,而是每次都弄一个新的美人来,然后某个部位上印着的那个数字改成次数,(感觉更变态了……)然后分个牌子。再把牌子给 l这个美人。

大概画一下,是这样的。

第0次

       +-----+ |  a  +------------------------+ +-----+                        |                                | +-----+                        | |  l  |                        | +--+--+                        |    |                           |    v                           | +======+                       | | l[0] +-------> {"num": 0} <--+ +======+     

第1次

       +-----+ |  a  +------------------------+ +-----+                        |                                | +-----+                        | |  l  |                        | +--+--+                        |    |                           |    v                           | +======+                       | | l[0] +-------> {"num": 0}    | +------+                       | | l[1] +-------> {"num": 1} <--+ +======+     

第2次

       +-----+ |  a  +------------------------+ +-----+                        |                                | +-----+                        | |  l  |                        | +--+--+                        |    |                           |    v                           | +======+                       | | l[0] +-------> {"num": 0}    | +------+                       | | l[1] +-------> {"num": 1}    | +------+                       | | l[2] +-------> {"num": 2} <--+ +======+     

…………

第10次

       +-----+ |  a  +------------------------+ +-----+                        |                                | +-----+                        | |  l  |                        | +--+--+                        |    |                           |    v                           | +======+                       | | l[0] +-------> {"num": 0}    | +------+                       | | l[1] +-------> {"num": 1}    | +------+                       | | l[2] +-------> {"num": 2}    | +------+                       | | l[3] +-------> {"num": 3}    | +------+                       | | l[4] +-------> {"num": 4}    | +------+                       | | l[5] +-------> {"num": 5}    | +------+                       | | l[6] +-------> {"num": 6}    | +------+                       | | l[7] +-------> {"num": 7}    | +------+                       | | l[8] +-------> {"num": 8}    | +------+                       | | l[9] +-------> {"num": 9} <--+ +======+     


这次,你再把 l这个牌子交给画师,画师同样把十个牌子的美人都画一次,但这次则是十个美人,那个部位的数字各有不同,所以,得到了你想要的 0到9。

按正常双休的话,这些美人,够你夜夜欢愉俩星期不重样的了。年轻人要注意身体啊!要不就多补补,去学习一下内存的知识吧!


对引用什么的有兴趣,也可以来看看我这个万年没更新的专栏:

看漫画·做实验·学编程


啥时候会更新这个问题,上帝说:“我是看不到了……”




  

相关话题

  Python为什么需要用import导入模块?直接自动将所有模块都导入不是更好吗? 
  学会Python后好就业吗? 
  为什么苹果新语言 Swift 的 RC4 运算效能是 Python 的 220 倍? 
  如果有两颗药丸,一颗吃了让你写代码100%不出错,另一颗吃了能让你100%发现并修改bug,选哪颗? 
  如何看待 Python 进入山东小学课本?会推广到其他地区吗? 
  有哪些生活小事让你感叹到「这个世界已经离不开程序员了」? 
  C++ STL中的map用红黑树实现,搜索效率是O(lgN),为什么不像python一样用散列表从而获得常数级搜索效率呢? 
  如果代码按行付费,会有什么好玩的事情发生? 
  在编程语言中,循环语句为何选择 while 而不是 when 作为关键词? 
  参加数学建模用 MATLAB,还是 Python? 

前一个讨论
家庭影院音响怎么选?
下一个讨论
在国外工作的人愿意回国工作么?动机有哪些呢?薪资打折能接受么?





© 2024-12-26 - tinynew.org. All Rights Reserved.
© 2024-12-26 - tinynew.org. 保留所有权利