本篇要介紹的,則是其他一些一不小心,可能就會產生非預期結果的範例。
List 的指派,跟一般變數不太一樣,改了源頭,其他的會跟著改:
12345a
=
[
12
,
34
,
56
,
78
,
90
]
b
=
a
a[
0
]
=
99
(a)
(b)
# 跟著改變了
如果你希望跟一般變數的操作一樣,會有新的一份串列,可以這樣用:
12345a
=
[
12
,
34
,
56
,
78
,
90
]
b
=
a[:]
a[
0
]
=
99
(a)
(b)
# 不會受影響
但是前面說過,串列可以把不同類型的資料放在一起,甚至可以再放入串列。這時候又會出現一些問題,因為串列裡面又有串列,包了好多層;但是「[:]」這種語法,只能複製一層:
12345a
=
[[
12
,
34
],
56
,
78
,
90
]
b
=
a[:]
a[
0
][
0
]
=
99
(a)
(b)
# 又跟著改變了
如果真的要把每一層都複製,可以這樣使用:
123456import
copy
a
=
[[
12
,
34
],
56
,
78
,
90
]
b
=
copy.deepcopy(a)
a[
0
][
0
]
=
99
(a)
(b)
# 總算不會受影響了
另外,你可能還記得,函式當中的預設參數,在每次呼叫時都會重新給值;但是若預設參數是串列時,附加的值會被保留:
12345678def
test(x, a
=
[]):
(
"Content of a when entering test:"
, a)
a.append(x)
(
"Content of a when exiting test:"
, a)
test(
12
)
test(
34
)
test(
56
)