全可以访问相同的对象, 因此我们讲 这种变量名也叫对象的 "引用".
验证1:
a = 2 b = 3 print(id(a),id(b)) #140734889681584 140734889681616 b = 2 print(id(b)) #140734889681584
验证2:
b = 3 print(id(b)) #140734889681616 b +=1 print(id(b)) #140734889681648
相加其实是创建一个新的对象,然后把这个标签b移到这个新的对象上
思考: 为什么Python的变量是这样的? 和C/C++差异这么大捏?
Python的GC机制, 是这样的设定的基础.
int
,str
,float
,tuple
其实是不可变类型的变量 (即:没办法修改一个已经存在的int类型的对象的值),只能创建新的,不能修改已经有的s = "hehe" s[0] = 'a'; #error 报错 TypeError: 'str' object does not support item assignment s = 'a'+s[1:] #只能重新创建 print(s) #aehe #原来的hehe对象已经销毁,s贴在了aehe这个对象的身上
列表和字典都是可变对象:
类似的, C语言是一种静态弱类型语言. Java的类型检查更为严格, 一般认为是静态强类型, 而Javascript则是动态弱类型
如:
int a = 10; long b = 20; a = b ->C++可以 java不可
int a = 10; bool b = false; a = b ->C++可以,把false当成0 java不可
动态类型:小规模下更好,使用灵活
大规模常用静态类型,否则多人协作容易有歧义
但是类型:越强越好
注意:如果想要比较两个浮点数是否相同,不能直接比较,因为会有精度损失,要做差比较
前面我们说, 类型也是对象
print(type(type(100))) #<class 'type'> print(id(type(100))) #140734889206240
Python有一个特殊的类型, 称为NoneType. 这个类型只有一个对象, 叫做None
print(type(None)) #<class 'NoneType'>
def func(): print("haha") ret = func() #打印haha 函数没有返回值却接收了,就是None print(ret) #打印None,
所有的标准对象, 均可以用于布尔测试(放到if条件中).
下列对象的布尔值是False:
if "": print("True") else: print("False") #打印:False
其他情况下, 这些内建对象的布尔值就是True.