学python千万别想当然
来源:互联网 发布:原油软件 编辑:程序博客网 时间:2024/04/28 21:27
学语言千万别想当然。对于python语言,如果当做c++或者c#来学,是很危险的一件事。
比如
class student():
pass
a = student
b = student()
如果按照c++的理解,两者可以理解为a = new student, b = new student(),那么两个的含义是一样的。但对于python,这两个的含义是完全不同的。
由于python中所有的类都是对象,包括object类,int类,str类,统统都是对象。因此,a表示student对象的引用,注意,不是student生成的对象的引用,a就是student。甚至可以写c =a(),等价于c=student()。
而第二种形式b=student()表示b为student生成的对象的引用。如果非要测试,可以这样
class student():
pass
a = student
b = student()
print(type(a))
print(type(b))
type(a)为<class 'type'>,而type(b)为<class '__main__.student'>。可见,a就是student。如果明白了这些,可以在测试一道题目:
class student():
pass
a = student
b = student()
a.name = 'aaa'
c = student()
print(b.name)
print(c.name)
结果应该都是aaa,而不应该报错。为什么,因为python的类为动态的,不是静态的哦。改变了a就是改变了student,当然就改变了b,c。b,c是student的对象的引用嘛。
但可能有同学有疑问:c我可以理解,为什么b也会改变,b生成的时候,student还没有name成员呢。
问题很好,我当时也不明白,使得我不得不阅读了一下python的源码。简单说来,就是python的所有类都是对象。什么意思?简单画个图。实际上,a,b,c的关系是这样的:
当然,实际的关系要复杂的多,只是简单表示了一下,a,b,c,student的关系。可以看到,实际上b是指向student对象的,所以,无论什么时候,只要student发生了变化,那么b就可以看到。
Ps:本人python菜鸟,正在苦学python,写此文只是给遇到同样问题的人提醒一下,认识比较粗浅,请大牛们莫拍。
- 学python千万别想当然
- 千万别学英语
- 千万别学英语
- 千万别学英语
- 数学,千万别学过火
- 数学,千万别学过火
- 数学,千万别学过火
- 《千万别学英语》精粹
- 《千万别学英语》总结
- 《千万别学英语》--第一阶段学习记录
- 《千万别学英语》--第二阶段学习记录
- Tips_千万别学英语 第一阶段
- 《千万别学英语》阶段步骤
- 《千万别学英语》阶段步骤
- 千万别学英语中的方法
- 《千万别学英语》--第二阶段学习初感!
- 千万别学英语(摘自韩国人:郑赞荣)
- 《千万别学英语》一种非常好的学习方法
- 在 SDN 中,OpenFlow 和 Open vSwitch 的区别是什么
- 代码重构(六):代码重构完整案例
- 熟练这些,才会知道 Android studio 有多高效
- net::ERR_BLOCKED_BY_CLIENT
- [Leetcode] 112. Path Sum 解题报告
- 学python千万别想当然
- mac 版webstorm 破解终极版本
- 字符串"alibaba"的二进制哈夫曼编码有多少位
- ExtJS 按钮分隔快捷符号
- petalinux-package qspi 启动 生成的镜像启动不了的问题。
- java project如何导入jar包
- redis集群搭建与简单实现
- 自定义choose,when,otherwise标签
- SIFT与SURF之比较