打开主菜单

參考與物件编辑

很重要的一件事情,你必須記得,指定物件給變數並沒有發生複製的動作。所以可以有很多變數參考到同一個物件。

>>> a1 = (1,2,3)
(1, 2, 3)
>>> a2 = a1
(1, 2, 3)
>>> a2[0] = 0
0
>>> a1
(0, 2, 3)

在處理數值型別時,就不是如此了,因為與複製數值(通常只有4或8個bytes)比起來,複製大的物件的代價是很昂貴的。你可以在 Boo 裡定義自己的值型別,當然你得有個好理由。

如果兩個物件相等,這意味著他們可能是相同的物件,或是他們有相同的內容。is運算子可以告訴你這兩個參考是否一樣:

>>> l1 = [1,2,3]
[1, 2, 3]
>>> l2 = l1
[1, 2, 3]
>>> l3 = [1,2,3]
[1, 2, 3]
>>> l1 == l3
true
>>> l1 is l3
false
>>> l1 == l2
true
>>> l1 is l2
true

有時候你想作的是複製物件,陣列有個Clone方法,但串列卻沒有(這是個敗筆嗎?):

>>> a3 = a1.Clone()
(1, 2, 3)
>>> a3 == a1
true
>>> a3 is a1
false
>>> l1 = [1,2,3]
[1, 2, 3]
>>> l2 = l1.Clone()
------------^
ERROR: 'Clone' is not a member of 'Boo.Lang.List'.
>>> l2 = l1[:]
[1, 2, 3]

還記得前面提過的 Slicing 嗎? l1[:] 表示取得串列的所有元素,這樣就能複製整個串列了,這個技巧在所有可以 slicing 的型別上都適用,像字串、串列、陣列都行。


上一章:雜湊(Hashes) 目錄 下一章:控制結構