python小白 问关于a+=a 和a=a+a的区别
问题描述
第一段代码:
# -*- coding:gb2312 -*-a = [100]def test(num): num += num #第一段代码 print(num) test(a)print(a)
执行结果:
第二段代码:
# -*- coding:gb2312 -*-a = [100]def test(num): num = num + num #这个地方改了一下 print(num) test(a)print(a)
执行结果:
我的问题:num += num不应该直接等价于mun = num+num 么为什么算出来结果却是不一样的?这个是什么情况
问题解答
回答1:你可以尝试进行这样的操作,
In [1]: a = [100]In [2]: b = [100]In [3]: id(a)Out[3]: 79308552LIn [4]: id(b)Out[4]: 79342728LIn [5]: a += aIn [6]: b = b + bIn [7]: id(a)Out[7]: 79308552LIn [8]: id(b)Out[8]: 79341192L
通过id()这个函数可以得到变量所分配的内存地址。通过实验发现使用了+的变量地址发生了变化,也就是你所说的num+=num与num=num+num不等价。但是,当做如下骚操作时候又会发现啪啪啪打脸
In [19]: a = (0,)In [20]: b = (0,)In [21]: id(a)Out[21]: 82230688LIn [22]: id(b)Out[22]: 82208920LIn [23]: a += aIn [24]: b = b + bIn [25]: id(a)Out[25]: 79268296LIn [26]: id(b)Out[26]: 79328392L
分配的地址似乎一直在改变。原因在于,Python中的数据结构分为可变(mutable)和不可变(immutable)。对于可变类型,=和+=有着明显的不同,如上面的list:+表示连接操作,+=表示追加对于不可变类型,=和+=就是一样的操作,如上面的tuple可变类型与不可变类型的本质在于内存空间是否可变~
回答2:首先看出区别在于
In [26]: def test(num): ...: num = num + num ...: print (num) ...:In [27]: def test1(num): ...: num += num ...: print (num) ...:In [28]: import disIn [29]: dis.dis(test) 2 0 LOAD_FAST0 (num) 3 LOAD_FAST0 (num) 6 BINARY_ADD #区别在这儿 7 STORE_FAST 0 (num) 3 10 LOAD_FAST0 (num) 13 PRINT_ITEM 14 PRINT_NEWLINE 15 LOAD_CONST 0 (None) 18 RETURN_VALUEIn [30]: dis.dis(test1) 2 0 LOAD_FAST0 (num) 3 LOAD_FAST0 (num) 6 INPLACE_ADD #看这儿 7 STORE_FAST 0 (num) 3 10 LOAD_FAST0 (num) 13 PRINT_ITEM 14 PRINT_NEWLINE 15 LOAD_CONST 0 (None) 18 RETURN_VALUE
可以看出分别调用的方法不同,分别是__add__,__iadd__加法运算符会计算出新的object来赋值给num增量赋值运算符修改原来的引用
参考这儿: https://stackoverflow.com/que...
回答3:Remember that arguments are passed by assignment in Python.
傳參數在python是用assignment 不是reference,所以你傳a過去函數時傳的是a的值,而不是a本身。若你要改動a本身就需要用return傳值回來
a = [100]def test(num): num = num + num #这个地方改了一下 return(num) #这个地方再改了一下 print(test(a)) #傳值回來print(a)a = test(a)print(a)
結果:
[100, 100][100][100, 100]回答4:
在python中,a=a+b是先创建一个新的对象并让变量a引用这个对象,a+=b是让a所引用的对象的值变成a+b的值
相关文章:
1. python - 关于beautifulsoup获取文档内容2. node.js - ionic2 创建项目 ionic server 报这个错 有朋友可以帮忙看看吗!3. dockerfile - 为什么docker容器启动不了?4. 网页爬虫 - Python小白用Scrapy爬虫返回的是空元素,请问各位大神哪里出了问题?5. mysql里的大表用mycat做水平拆分,是不是要先手动分好,再配置mycat6. debian - docker依赖的aufs-tools源码哪里可以找到啊?7. mysql - 如何在数据库里优化 汉明距离 查询?8. android - java tm platform se binary 占用很多内存9. python flask做的文件系统上传系统,路径没错,文件列表加载不出来,error 1005310. node.js - nodejs连接mysql,输入指令为什么
