Python学习中遇到的问题

系统 134 0

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)。

    我对不可变对象的理解就是给这个对象赋值之后,对象的值就不可以更改了,如果想改变对象的值,它会另外创造一个对象,把值赋给这个新对象,然后把变量名与之绑定。
    看图:
    Python学习中遇到的问题_第1张图片
    不可变对象的优点:
    减少了相同值对内存的占用。
    缺点:我要修改这个变量绑定的值,如果内存中没用存在该值的内存块,那么必须重新开辟一块内存,把新地址与变量名绑定。而不是修改变量原来指向的内存块的值,这回给执行效率带来一定的降低。

  • 可变对象,自然就是说,可以在原来基础上去改变值。
    - Python学习中遇到的问题_第2张图片

  • 我们来看两个函数:

            
              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了。


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请请扫描上面二维码支持博主1元、2元、5元等您想捐的金额吧,狠狠点击下面给点支持吧

发表我的评论
最新评论 总共0条评论