A brief introduction to sequence incremental assignment in Python (with examples)

不言
Release: 2018-10-08 16:29:24
forward
3028 people have browsed it

This article brings you a brief introduction to sequence incremental assignment in Python (with examples). It has certain reference value. Friends in need can refer to it. I hope it will be helpful to you.

The incremental assignment operators include = and *=. = The special method behind is __iadd__. If a class does not implement the __iadd__ method, Python will take a step back and call it __add__ method. The difference between these two methods is that __iadd__ is an in-place change and will not change the memory address of the original value, while the __add__ method will get a new object.

Consider the following expression:

a = b

If a implements the __iadd__ method, a will be changed in place (the memory address remains unchanged). If a does not implement the __iadd__ method, then the effect of the expression a = b becomes the same as a = a b, generating a new object and assigning it to a.

Generally speaking, variable sequences generally implement the __iadd__ method, so = is an in-place addition, while immutable sequences do not support this operation at all.

*= is the same as =, except that the special method behind it is __imul__.

a = [1, 2, 3]
b = [4, 5, 6]print("id(a) = %d" % id(a))
a += bprint("id(a) = %d" % id(a))

c = [1, 2, 3]print("id(c) = %d" % id(c))
c = c + bprint("id(c) = %d" % id(c))

d = (1, 2, 3)print("id(d) = %d" % id(d))
d *= 2print("id(d) = %d" % id(d))
Copy after login

The running results are as follows:

id(a) = 1298277978824
id(a) = 1298277978824
id(c) = 1298277978696
id(c) = 1298277978632
id(d) = 1298277972872
id(d) = 1298277136616
Copy after login

Understand the incremental assignment of the sequence, Let’s look at the puzzle mentioned by Leonardo Rochael at the Python Brazil conference in 2013:

t = (1, 2, [30, 40])
t[2] += [50, 60]
Copy after login

A. t becomes (1, 2, [30 , 40, 50, 60])

B. Because tuple does not support assignment to its elements, a TypeError exception will be thrown

C. Neither of the above is

D. A and B are both correct

I guess many people will choose B like me, but in fact the answer is D. Run the code on the console and the result is as follows:

Summary:

1. If you perform repeated splicing operations on immutable sequences , the efficiency will be very low, because each time you have to create a new sequence, then copy the elements in the original sequence to the new sequence, and then append new elements.

2. Don’t put mutable objects in tuples.

3. Incremental assignment is not an atomic operation. We just saw that although it threw an exception, the value of t still changed.

The above is the detailed content of A brief introduction to sequence incremental assignment in Python (with examples). For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:cnblogs.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template