Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
458 views
in Technique[技术] by (71.8m points)

Are Python Lists mutable?

When I type following code,

x=[1,2,4]
print(x)
print("x",id(x))
x=[2,5,3]
print(x)
print("x",id(x))

it gives the output as

[1, 2, 4]
x 47606160
[2, 5, 3]
x 47578768

If lists are mutable then why it give 2 memory address when changing the list x?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You created a new list object and bound it to the same name, x. You never mutated the existing list object bound to x at the start.

Names in Python are just references. Assignment is binding a name to an object. When you assign to x again, you are pointing that reference to a different object. In your code, you simply created a whole new list object, then rebound x to that new object.

If you want to mutate a list, call methods on that object:

x.append(2)
x.extend([2, 3, 5])

or assign to indices or slices of the list:

x[2] = 42
x[:3] = [5, 6, 7]

Demo:

>>> x = [1, 2, 3]
>>> id(x)
4301563088
>>> x
[1, 2, 3]
>>> x[:2] = [42, 81]
>>> x
[42, 81, 3]
>>> id(x)
4301563088

We changed the list object (mutated it), but the id() of that list object did not change. It is still the same list object.

Perhaps this excellent presentation by Ned Batchelder on Python names and binding can help: Facts and myths about Python names and values.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...