先上今天群里发现的很有意思的一个函数。
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
如上,非常简单的一个函数,看看输出是什么
print(f(2))
[0, 1]
一切都很正常,**
但是!
再执行一次呢?
[0, 1]
None
[0, 1, 0, 1] #忽略这里的None,发现?????? 怎么列表变成了这样,按道理不应该是返回和第一次返回的一样的值吗。
None
经过对函数的一点改装,发现问题所在。
def f(x,l=[]):
for i in range(x):
l.append(i*i)
print(l)
print(id(l))
print(f(2))
print(f(2))
[0, 1]
2411718212680 #l的内存地址
None
[0, 1, 0, 1]
2411718212680 #也是l的内存地址,完全一样!
None
对原函数追加一条代码 print(id(l)) 来得到这个列表的内存地址,再继续按上面的步骤执行两次之后发现,
内存地址一样,这样就不难理解了! python在执行这个函数的时候,第一次执行,python在某个内存地址里创造了这个列表l,默认传入是个空列表,但是在执行一次之后,这个列表里已经保存了内容,再次执行的时候,
由于没有传入l参数,不要误以为这里l默认还是传入了空列表,这个时候python会调用指向这个内存地址的列表作为这个函数的默认参数传入,所以其实第二次执行的时候就相当于执行了下面的语句!
print(f(2,l=[0,1])
python中is和==的区别。
直接上代码,cmd命令行中
>>> a = 1
>>> b = 1
>>> a == b
True
>>> a is b
True
这里没问题,再看下面
>>> a = 1000
>>> b = 1000
>>> a == b
True
>>> a is b #注意比较上面代码和这里的代码!
False
>>> id(a)
2634722354288
>>> id(b) #承接上述代码,会发现a和b都指向1000时,内存地址是不一样的!
2634722356976
如上,这里就可以得出结论了,python中,==仅仅用来比较二者的值相不相等,是比较浅层的判断。
而is是对于两个对象内存地址的判断,是更深层次的判断! 请看下述例子
>>> id(True)
1402990752
>>> id(2>1) #地址一样。
1402990752
这里还有个知识可以掌握,python中,在[-5,256]这个区间内,不同变量的赋值,赋给同样的值时,他们的内存地址是相等的,所以既可以用is判断,又可以用==来判断,看下面代码。
>>> a = 256
>>> b = 256
>>> a == b
True
>>> a is b
True
>>> a = 257
>>> b = 257
>>> a == b
True
>>> a is b
False
>>> a = -5
>>> b = -5
>>> a == b
True
>>> a is b
True
>>> a = -6
>>> b = -6
>>> a == b
True
>>> a is b
False
由上述代码可见,[-5, 256] 是闭区间,两端可以取到,到这里结束了。
一点小知识,可以帮助理解python运作时的原理,帮助加深对代码的理解。
继续进步!!