Home  >  Article  >  Backend Development  >  Be wary of the *duplicate character (operator) in python

Be wary of the *duplicate character (operator) in python

大家讲道理
大家讲道理Original
2016-11-07 17:21:231276browse

There is a special symbol "*" in python, which can be used as a multiplication operator for numerical operations and as a repetition operator for objects. However, you must pay attention when using it as a repetition operator

Note that: *Each repeated object has the same id, which means it points to the same address in the memory. You must pay attention when operating each object.

For example:

>>> alist = [range(3)]*4
>>> alist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

The above initializes a two-level list to simulate the matrix. The matrix is ​​4X3. For the convenience of description, the matrix is ​​denoted as A here.

Now I want to assign a value of 1 to A11, using the following code:

alist[0][0]=1

Then the result we want should be:

[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

But unfortunately, what we get is:

[[1, 1, 2], [1, 1, 2], [1, 1, 2], [1, 1, 2]]

What is going on? Why is A21 assigned a value? Why are other Ai1 What has changed?

The reason is this:

We have already said it at the beginning of the article. * Each repeated object has the same id, which means it points to the same address in the memory. You must pay attention when operating each object. .

We used the repetition operator "*" when initializing. When this operator performs repeated operations on objects, all repeated objects will point to the same memory address. So when you change one of the values,

Other values ​​will naturally be updated. The explanation in python is the following command and output:

>>> id(alist[0])
18858192
>>> id(alist[1])
18858192
>>> id(alist[2])
18858192
>>> id(alist[3])
18858192
>>>

As you can see, the ids are all the same, which means that these 4 lists are the same "list" .

In this case, what should we do if we want to simulate a matrix? In addition to the special numpy package, you can of course append new lists to the upper list one by one, for example:

>>> blist=[]
>>> for i in range(4):
    blist.append([j for j in range(3)])
>>> blist
[[0, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]

In this way, let’s try again The above assignment operation:

>>> blist[0][0]=1
>>> blist
[[1, 1, 2], [0, 1, 2], [0, 1, 2], [0, 1, 2]]
>>>


Statement:
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