zoukankan      html  css  js  c++  java
  • python中+与+=,=+

    #对于可变类型:
    #+= 不会创建新对象,是在原对象上操作。
    #+会创建新对象

    备注:
    什么是可变/不可变对象
    不可变对象,该对象所指向的内存中的值不能被改变。当改变某个变量时候,由于其所指的值不能被改变,相当于把原来的值复制一份后再改变,这会开辟一个新的地址,变量再指向这个新的地址。
    可变对象,该对象所指向的内存中的值可以被改变。变量(准确的说是引用)改变后,实际上是其所指的值直接发生改变,并没有发生复制行为,也没有开辟新的出地址,通俗点说就是原地改变
    Python中,数值类型(intfloat)、字符串str、元组tuple都是不可变类型。而列表list、字典dict、集合set是可变类型
    # 一:对于列表的操作;  + 运算符可以使用在列表上,+ 运算符只需要第二个操作数是可迭代的,isinstance([], Iterable)为True,列表为可迭代的
    tmp = [1,2]
    print("tmp 内存地址是:%s" %id(tmp))
    #第一种
    #tmp += [3,4]
    #结论:地址未变,对于可变对象,+ 操作改变了值,id肯定会变,而+= 是本地操作,其值原地修改
    # tmp 内存地址是:2939192697480
    # tmp 内容是:[1, 2, 3, 4]
    # tmp += 后内存地址是:2939192697480
    #第二种
    #结论:地址改变,对于+号操作,可变对象和不可变对象调用的都是__add__操作
    #tmp = tmp + [3,4]
    # tmp 内存地址是:2332801720968
    # tmp 内容是:[1, 2, 3, 4]
    # tmp += 后内存地址是:2332831383880
    #第三种
    #结论:报错
    #tmp =+ [3,4]
    #TypeError: bad operand type for unary +: 'list'
    print("tmp 内容是:%s" %tmp)
    print("tmp += 后内存地址是:%s" %id(tmp))

    #二:对于int类型,不可变变量,
    sum1 =+ 1;未创建新对象;

     

    
    

    sum1=sum1+1,+创建新对象,

     

     sum1 +=1,创建了新对象,

    对于+=号操作,可变对象调用__add__,内存地址不变

    不可变对象调用的是__iadd__(不可变对象没有__iadd__)   __iadd__是原地修改,内存地址改变

     

     

     
  • 相关阅读:
    Struts2
    Struts2
    学习python的第九天
    学习python的第八天--作业
    学习python的第七天--作业
    学习python第六天 --作业
    学习python的第六天---1(理论)
    学习python第五天
    学习python第四天
    学习python第三天
  • 原文地址:https://www.cnblogs.com/sanshuimiao/p/12562466.html
Copyright © 2011-2022 走看看