前言
本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍:
直接看下面代码:
x +=y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
In [ 66 ]: id (a)
Out[ 66 ]: 4476839480
In [ 67 ]: id (b)
Out[ 67 ]: 4476839480
In [ 68 ]: a = [ 1 , 2 , 3 ]
In [ 69 ]: b = a
In [ 70 ]: id (a)
Out[ 70 ]: 4477149984
In [ 71 ]: id (b)
Out[ 71 ]: 4477149984
In [ 72 ]: a + = [ 4 , 5 , 6 ]
In [ 73 ]: a
Out[ 73 ]: [ 1 , 2 , 3 , 4 , 5 , 6 ]
In [ 74 ]: b
Out[ 74 ]: [ 1 , 2 , 3 , 4 , 5 , 6 ]
In [ 75 ]: id (a)
Out[ 75 ]: 4477149984
In [ 76 ]: id (b)
Out[ 76 ]: 4477149984
|
x = x + y
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
In [ 77 ]: a = [ 1 , 2 , 3 ]
In [ 78 ]: b = a
In [ 79 ]: id (a)
Out[ 79 ]: 4476686208
In [ 80 ]: id (b)
Out[ 80 ]: 4476686208
In [ 81 ]: a = a + [ 4 , 5 , 6 ]
In [ 82 ]: a
Out[ 82 ]: [ 1 , 2 , 3 , 4 , 5 , 6 ]
In [ 83 ]: b
Out[ 83 ]: [ 1 , 2 , 3 ]
In [ 84 ]: id (a)
Out[ 84 ]: 4477187640
In [ 85 ]: id (b)
Out[ 85 ]: 4476686208
|
可以看出对于可变对象而言 x = x + y 这种形式已经改变了x的指向,而不是"inplace"的修改。
使用dis模块进行一下验证。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
In [ 86 ]: def foo(x, y):
...: x + = y
...: return x
...:
In [ 87 ]: def foo(x, y):
...: x + = y
...:
In [ 88 ]: def foo2(x, y):
...: x = x + y
...:
In [ 89 ]: dis.dis(foo)
2 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 INPLACE_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 ( None )
13 RETURN_VALUE
In [ 90 ]: dis.dis(foo2)
2 0 LOAD_FAST 0 (x)
3 LOAD_FAST 1 (y)
6 BINARY_ADD
7 STORE_FAST 0 (x)
10 LOAD_CONST 0 ( None )
13 RETURN_VALUE
|
可以看到字节码是不同的:
- += 对应 INPLACE_ADD
- 对应BINARY_ADD
注意:以上仅适用于CPython实现。
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。
原文链接:https://hooog.tk/posts/inplace-binary-add/