python中is和==的区别,以及函数中数据保存的内存地址

先上今天群里发现的很有意思的一个函数。

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运作时的原理,帮助加深对代码的理解。
继续进步!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值