wasm-demo/demo/ermis-f/python_m/cur/0152

41 lines
1.3 KiB
Plaintext

From: dacut at kanga.org (David Cuthbert)
Date: Fri, 23 Apr 1999 20:32:41 -0400
Subject: Bug or Feature?
References: <37208E69.4B022E0C@mediaone.net>
Message-ID: <7fr3eg$bqr@world1.bellatlantic.net>
X-UID: 152
Fuming Wang <fmwang at mediaone.net> wrote:
> I found this little surprise with Python 1.5.1:
> >list = [[0]*2]*4
> >list
> [[0, 0], [0, 0], [0, 0], [0, 0]]
> >list[0][1] = 9
> >list
> [[0, 9], [0, 9], [0, 9], [0, 9]]
> Is this a bug or a feature that I don't know about?
Most definitely a feature. You're getting the same reference for all four
list elements. To break it apart:
list = [[0] * 2] * 4 # let a = 0, an integer.
[[a] * 2] * 4 # integers are immutable, so a copy is made
# for [a] * 2; let the copy be b.
[[a, b]] * 4 # ah, but [a, b] is a list, q.
[ q ] * 4 # lists are mutable, so we're just expanding
# references that all refer to the same
# q object.
[ q, q, q, q ] # Ta da! All four elements have the same
# object.
If this were not the case, lists would be completely unnecessary since they
would be the same as tuples!