1.None和[]的区别
以前以为None就是空,直到看到了下面这段代码
list=[]
if list is None:
print "list is NULL"
else:
print "list is %s" %list
发现输出是list is [],而不是list is NULL。这说明None和[]
不等同
。
去翻了几篇博客后,才知道None表示的是这个对象还没创建,而[]表示的是这个对象创建了,但是还没有值。
“一个盒子不装东西它还是一个盒子([]),你把盒子拆了它就是none了”
2.关于可变对象和不可变对象的理解
果然学习一门语言就要换一种方式来对待它。
看代码:
x = 12323
y = 12323
z = 12323
print id(x)
print id(y)
print id(z)
#输出:
50747600
50747600
50747600
#
print x is y
print y is z
#True
True#
我和伙伴们都惊呆了。。
python里的对象分为可变对象和不可变对象(python万物皆对象)。
-
不可变对象有:int、字符串(string)、float、(数值型number)、元组(tuple)。
可变对象有:字典型(dictionary)、列表型(list)。我对不可变对象的理解就是给这个对象赋值之后,对象的值就不可以更改了,如果想改变对象的值,它会另外创造一个对象,把值赋给这个新对象,然后把变量名与之绑定。
看图:
不可变对象的优点:
减少了相同值对内存的占用。
缺点:我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。 -
我们来看两个函数:
def f(a, L = []):
L.append(a)
print id(L)
return L
print f(1)
print f(2)
print f(3)
#
[1]
[1, 2]
[1, 2, 3]
#
def f(a, L = None):
if(L is None):
L = []
L.append(a)
return L
print f(1)
print f(2)
print f(3)
#
[1]
[2]
[3]
#
第一个代码的输出,是因为L是可变对象,它被创建了之后,第二次调用的时候,我们发现,L存在,所有就不会重新创建(没有执行L=[]),所以会在原来的基础上放进去一个2.
第二个代码的输出,是因为每次L都被置为None了。