zoukankan      html  css  js  c++  java
  • Python 可变对象 & 不可变对象

    Python 可变对象 & 不可变对象

    不可变对象

    Python 中不可变对象包括 int, string, float, tuple
    不可变对象就是值不可变,但是其中一些看起来是可以变化的,比如:

    a = 0
    print(a, id(a))
    
    a += 1
    print(a, id(a))
    
    

    输出结果:

    0 4565339072
    1 4565339104
    

    由于 Python 变量中存储的都是引用,所以看似 a 的值从 0 变成了 1,但是其实只是 a 指向的对象从 0 变成了 1,并不是 0 变成了 1,通过 id() 可以看出在变化前后 a 指向的对象并不相同

    特点

    • 不可变对象可以作为字典的 key
    a = {('a', 1): 'a'}
    

    • 不可变对象没有 .copy() 方法,直接使用 = 进行复制
    a = 1
    b = a
    a += 1
    print(a, b)
    
    

    输出结果:

    2, 1
    

    可变对象

    python 中可变对象包括 list, dict, set
    可变对象的值可以直接进行修改:

    a = []
    print(a, id(a))
    
    a.append(1)
    print(a, id(a))
    
    

    输出结果

    [] 140279066188672
    [1] 140279066188672
    

    可以看到虽然 a 发生了变化,但是他的内存地址并没有改变,说明只是对象的值发生了改变

    特点

    • 可变对象不能作为字典的 key
    a = {['a', 1]: 'a'}
    

    报错

    TypeError: unhashable type: 'list'
    

    • 可变对象有 copy() 方法,通过该方法可以实现浅 copy,复制到的是可变对象中所有对象的内存地址
      也就是如果可变对象里面嵌套着可变对象,则复制出的内层可变对象和复制前内层可变对象是同一个对象
    a = [1, 2, 3, [1, 2]]
    b = a.copy()
    print(' a: ', a, '
    ', 'b: ', b, '
    ')
    
    a.append(4)
    print(' a: ', a, '
    ', 'b: ', b, '
    ')
    
    a[3].append(3)
    print(' a: ', a, '
    ', 'b: ', b, '
    ')
    
    

    输出结果:

     a:  [1, 2, 3, [1, 2]] 
     b:  [1, 2, 3, [1, 2]] 
    
     a:  [1, 2, 3, [1, 2], 4] 
     b:  [1, 2, 3, [1, 2]] 
    
     a:  [1, 2, 3, [1, 2, 3], 4] 
     b:  [1, 2, 3, [1, 2, 3]] 
    

    可以看出当 a 修改外层可变对象时,b 不会发生改变
    当 a 修改内层可变对象时,b 中的内层可变对象也会跟着改变

  • 相关阅读:
    call apply bind的区别
    Js的继承方法
    JS回调函数 回调地狱问题 以及解决方法
    Js闭包
    Js中的this指向问题
    ES6 Class继承
    面向对象
    Vue
    JavaScript数组 字符串的方法
    28.mysql练习
  • 原文地址:https://www.cnblogs.com/dbf-/p/14464755.html
Copyright © 2011-2022 走看看