最新公告
  • 欢迎您光临网站无忧模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Python的高级特性:容易忽略的不可变类型

    正文概述    2020-03-09   384

    Python的高级特性:容易忽略的不可变类型

    Python 中有一些容易忽略的不可变类型 Str、Integer、None、Tuple

    # 错误演示
    
    In [45]: def demo(lst = []):
       ....:     lst.append("hello")
       ....:     return lst
       ....: 
    
    In [46]: demo()
    Out[46]: ['hello']
    
    In [47]: demo()
    Out[47]: ['hello', 'hello']

    廖雪峰的 Python 教程有提到这一块,但并没有太细致。在这里,由于 lst 是一个可变参数,而 demo 在初始化时 lst 参数指向一个 [] 的内存空间,之后每一次调用,[] 这个内存空间都 append 一个「hello」,而由于 lst 依然指向这个内存空间,所以就会看到 demo 函数调用的奇怪现象,解决问题的办法就是引入不可变类型。

    #正确演示
    
    In [54]: def demo(lst = None):
       ....:     lst = []
       ....:     lst.append("hello")
       ....:     return lst
       ....: 
    
    In [55]: demo()
    Out[55]: ['hello']
    
    In [56]: demo()
    Out[56]: ['hello']

    在正确演示中,将 lst 初始化为 None, 这样 lst 就是一个不可变参数,但是不能直接对 lst 直接使用 append,因为只有 list 才有 append 方法,因此需要将 lst 进行真正的初始化 lst = []

    可变类型和不可变类型是一个很容易忽略的知识点,在这里深入进行研究,下面例举常见的不可变类型和可变类型。

    不可变「mutable」类型:

    int, long, float, string, tuple, frozenset

    可变类型「immutable」类型:

    list, dict

    Python中所有变量都是值的引用,也就说变量通过绑定的方式指向其值。 而这里说的不可变指的是值的不可变。 对于不可变类型的变量,如果要更改变量,则会创建一个新值,把变量绑定到新值上,而旧值如果没有被引用就等待垃圾回收。下面用 int 和 list 分别作为代表进行讲解。

    #不可变类型
    
    In [31]: id(1),id(2)
    Out[31]: (4477999936, 4477999968)
    
    In [32]: a = 1
    
    In [33]: id(a)
    Out[33]: 4477999936
    
    In [34]: # 当a赋一个新值时,变量a会绑定到新值上
    
    In [35]: a = 3
    
    In [36]: id(a)
    Out[36]: 4478000000
    
    #可变类型
    
    In [38]: lst = [0]
    
    In [39]: id(lst)
    Out[39]: 4493976328
    
    In [40]: lst = [0,1]
    
    In [41]: id(lst)
    Out[41]: 4499600328

    表面上看可变类型,python 似乎实现了不同类型的管理方式,其实不是的。其实 lst 代表地址,它引用的 lst[0], lst[1] 的内存地址其实是变了的,因为 lst[i] 就是 int(此处),而 int 就是不可变类型。


    下载网 » Python的高级特性:容易忽略的不可变类型

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元