使用Python實現一個小型的航空訂票系統(3)

鴨脖發表於2012-05-16

下面說一說其中碰到的問題,首先便是這裡剛開始搞不清楚是傳引用還是傳物件.(我不知道這樣說是否合理,但是按照c++的角度來看待我覺得會簡單一點),我在航空公司那個類中有關於航班的列表,那麼如果我把某個航班物件append到這個列表中時,如果以後那個航班物件發生了改變,那麼相應的公司列表中的那個會不會發生改變呢?同樣的疑問也出現在了航班物件中的seat列表以及customer的seat列表.後來簡單的試驗了一下,發現是會改變的,這就是傳引用.實際上在簡明python中這樣說到:

當你建立一個物件並給它賦一個變數的時候,這個變數僅僅 參考 那個物件,而不是表示這個物件本身!也就是說,變數名指向你計算機中儲存那個物件的記憶體。這被稱作名稱到物件的繫結


其實陣列中存放的也是那個物件的地址,我想這和java中的是一樣的,除了基本資料型別.比如:

a = 0

b = a

a =9

這個時候a為多少b為多少呢?b會不會隨著a的變化而變化呢?答案是不會


再如:

a = 'a'

b= a

a = 'b'


但是如果這樣寫:

class A:

     def __init__(self):

        self.name = ''

a = A()

b = a

a.name = "nihao"

print b.name

結果為nihao

這說明非基本型別都是傳的引用.再比如這樣一個程式,

fun(a):

    a = 0

a = 9

fun(a)

print a

答案還是9這說明python在這方面和java是一至的



第二個問題,是程式碼結構問題,我將他抽象為下面這種形式:

class A:
    def __init__(self,mlist = []):
        self.mylist = mlist
class B:
    def __init__(self):
        self.P = None
    def setList(self,a):
        self.P = a
        a.mylist.append(self)

a1 = A()
a2 = A()

b1 = B()
b2 = B()

b1.setList(a1)
b2.setList(a1)

print a1.mylist
print a2.mylist


列印的結果會使我大吃一驚.....至今沒想通為什麼.........想看的話可以自己執行一下.......知道的一定要評論告訴我阿大神們!!!!!跪了!!!!




相關文章