python中a+=a和a=a+a的区别

+= 是 + 的一种升级版本, 具有能把执行后的结果再写回传递来的变量本身的功能, 可变变量自身有比不可变变量多一个魔法方法 _iadd_, += 操作调用 _iadd_方法,没有该方法时,再尝试调用_add_方法, 不可变变量没有_iadd_方法

举例:

# a += b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 += [3]
>>> a1
[0, 1, 2, 3]
>>> a2
[0, 1, 2, 3]

# a = a + b
>>> a1 = range(3)
>>> a2 = a1
>>> a2 = a2 + [3]
>>> a1
[0, 1, 2]
>>> a2
[0, 1, 2, 3]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
a1 = [0, 1, 2]
a1 += [3] <==> a1.__iadd__([3])
print(a1) # [0, 1, 2, 3]
  • 1
  • 2
  • 3

_iadd_方法直接在原对象 a1 上进行更新,该方法的返回值为None 
+ 操作调用add方法

a1 = [0, 1, 2]
a1 = a1 + [3] <==> a1 = a1.__add__([3])
  • 1
  • 2

_add_方法会返回一个新的对象,原对象不修改,因为这里 a1被重新赋值了,a1指向了一个新的对象

再举一个栗子, 你能判断并明白出下面的输出结果吗?:

+=

In [1]: def selfAdd(a):
   ...:     a += a
   ...:     print(a)
   ...:

In [2]: a_int = 1
# 传入不可变变量
In [3]: selfAdd(a_int)
2
# 不可变变量本身没有发生改变
In [4]: a_int
Out[4]: 1

In [6]: a_li = [1,2]
# 传入可变变量
In [7]: selfAdd(a_li)
[1, 2, 1, 2]
# += 后,可变变量内容发生改变
In [8]: a_li
Out[8]: [1, 2, 1, 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

=+

In [5]: def selfAdd2(a):
   ...:     a = a+a
   ...:     print(a)
   ...:
# 传入不可变变量
In [10]: selfAdd2(a_int)
2
# 如所料的没有改变
In [11]: a_int
Out[11]: 1
# 传入可变变量
In [12]: selfAdd2(a_li)
[1, 2, 1, 2]
# =+ 后,没有发生改变
In [13]: a_li
Out[13]: [1, 2]
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

这里还要注意:

Python中函数参数是引用传递(不是值传递)。对于不可变类型,因变量不能修改,所以运算不会影响到变量自身;而对于可变类型来说,函数体中的运算有可能会更改传入的参数变量。

举例:

In [51]: def count():
    ...:     fs = []
    ...:     for i in range(1,4):
    ...:         def f():
    ...:             return i*i
    ...:         fs.append(f)
    ...:     return fs
    ...: for f in count():
    ...:     print(f())
    ...:
9
9
9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

第一、可以看到打印结果全是9, 传递时函数的应用或者叫地址(这里 python 是高级语言, 主要面向开发应用的, 其实并不追究底层) 
第二、函数中前面声明并定义过程中, 并没有把之前的 i 值保存下来, 循环结束后, 函数中保留的只有最后一次传递进来的值:3 
第三、故, 循环调用函数时, 每次打印的都是 3*3 的结果: 9

    • 可变类型,值可以改变:

      • 列表 list
      • 字典 dict
    • 不可变类型,值不可以改变: 
      • 数值类型 int, long, bool, float
      • 字符串 str
      • 元组 tuple
      • 喜欢的朋友可以加QQ群,群内有免费资料供大家一起交流学习哦!!!

原文地址:https://www.cnblogs.com/zxcv1234/p/9457583.html

时间: 2024-07-30 18:50:37

python中a+=a和a=a+a的区别的相关文章

python中urllib, urllib2,urllib3, httplib,httplib2, request的区别

permike原文python中urllib, urllib2,urllib3, httplib,httplib2, request的区别 若只使用python3.X, 下面可以不看了, 记住有个urllib的库就行了 python2.X 有这些库名可用: urllib, urllib2, urllib3, httplib, httplib2, requests python3.X 有这些库名可用: urllib, urllib3, httplib2, requests 两者都有的urllib3

python中生成器对象和return 还有循环的区别

python中生成器对象和return 还有循环的区别 在python中存在这么一个关键字yield,这个关键字在项目中经常被用到,比如我写一个函数不想它只返回一次就结束那我们就不能用return,因为return后面就不能跟任何东西,意味着函数的结束.那么我们完全可以这么做: def main(): for i in range(1,100): yield i 这样就等于生成了一个循环返回对象,特别在爬虫scrapy中较为常见!yeild和return还有for 上本质有什么区别呢?其实很简单

python中表达式赋值与链式赋值的区别

python支持普通赋值,链式赋值,增量赋值,但不支持表达式赋值. 普通赋值:x  =1 增量赋值:x = 1 ; x  += 1 链式赋值---同时对几个变量进行赋值,例子如下 >>> x = 1 >>> x = y = x + 1 >>> x,y (2, 2) 在其它语言,如C语言中,支持表达式赋值,就是说,表达式是有返回值的,例如x = 1;y = (x += 1)),那么x,y的值都是2,在python中,会发生什么情况呢? >>&

python中List append()、extend()和insert()的区别

Python中向列表增加更多数据时,有append().extend()和insert()等方法 其中最常用的是list.append(obj) 向列表的尾部添加一个新的元素. 需要一次性添加多个元素时可以使用list.extend(seq) 在列表末尾一次性追加另一个序列中的多个值(用新列表扩展原来的列表) 示例及结果如下: 1 list = [1,2,3,4] 2 list.append([5,6,7]) 3 print(list) 4 list.extend([8,9,10]) 5 pri

Python中模块(Module)和包(Package)的区别

1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式.在Python中,一个.py文件就称之为一个模块(Module). 使用模块有什么好处? 最大的好处是大大提高了代码的可维护性.其次,编写代码不必从零开始.当一个模块编写完毕,就可以被其他地方引用.我们在编写程序的时候,也经常引用其他模

python中的可变与不可变对象的区别

Python中不可变对象:int, float, str, tuple, bool Python中可变对象: list, dict, set 不可变对象: a = 5 PK a= 4: 在5的内存地址和4的内存地址是不同的 可变对象: list = [1, 2, 3, 4] PK list.append(5, 6): 这中的list的内存地址是相同的 * 放在dict 和 set中的元组或者列表中的每一个对象都是用作为key的.如(1,2,3)可以,但(1,[2,3])则不可以[2,3]是可变的

Python中元祖,列表,字典的区别

Python中有3种內建的数据结构:列表.元祖和字典: 1.列表 list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目. 列表中的项目应该包括在方括号中,这样Python就知道你是指明一个列表.一旦你创建了一个列表,就可以添加.删除,或者是搜索列表中的项目.由于你可以增加或者删除项目,我们说列表是可变的数据类型,即这种类型是可以被改变的,且列表是可以嵌套的. 实例: #coding=UTF-8 #author:RXS002 animalslist = ['fox','ti

python中a=a+2与a+=2的区别

1.a=a+2,表示一个新的对象,新的对象名字还是a,但是指向的内存地址已经变了 >>> a=2 >>> id(a) 140406287260016 >>> a=a+2 >>> a 4 >>> id(a) 140406287259968 所以对于tuple对象(不可变对象),也是可以这样操作的 >>> tuple1=(1,2) >>> id(tuple1) 4521580448 &

python中a+=b与a=a+b的区别

lista = [] lista = lista + 'abc' print lista 报错提示只有列表才能与列表连接. lista = [] lista = lista + 'abc' print lista 顺利执行,打印输出:['a', 'b', 'c'] 可以看到+=是有个类似于C语言的类型转换的作用,与 a= a+b还是有一定区别的. 在程序中看到代码中有+=的这个用法,感到很迷惑,经自己实际测试后得到这个结果,特此记录.