SQL_Server全文索引的用法解析。本站提示廣大學習愛好者:(SQL_Server全文索引的用法解析)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL_Server全文索引的用法解析正文
思慮一下上面的代碼片斷:
def foo(numbers=[]): numbers.append(9) print numbers
在這裡,我們界說了一個 list (默許為空),給它參加9而且打印出來。
>>> foo() [9] >>> foo(numbers=[1,2]) [1, 2, 9] >>> foo(numbers=[1,2,3]) [1, 2, 3, 9]
看起來還行吧?可是當我們不輸出number 參數來挪用 foo 函數時,奇異的工作產生了:
>>> foo() # first time, like before [9] >>> foo() # second time [9, 9] >>> foo() # third time... [9, 9, 9] >>> foo() # WHAT IS THIS BLACK MAGIC?! [9, 9, 9, 9]
那末,這是神馬情形?直覺告知我們不管我們不輸出 number 參數挪用 foo 函數若干次,這裡的9應當被分派進了一個空的 list。這是錯的!在Python裡,函數的默許值其實函數界說的時刻實例化的,而不是在挪用的時刻。
那末我們依然會問,為何在挪用函數的時刻這個默許值卻被付與了分歧的值?由於在你每次給函數指定一個默許值的時刻,Python都邑存儲這個值。假如在挪用函數的時刻重寫了默許值,那末這個存儲的值就不會被應用。當你不重寫默許值的時刻,那末Python就會讓默許值援用存儲的值(這個例子裡的numbers)。它其實不是將存儲的值拷貝來為這個變量賦值。這個概念能夠對初學者來講,懂得起來會比擬費勁,所以可以如許來懂得:有兩個變量,一個是外部的,一個是以後運轉時的變量。實際就是我們有兩個變量來用雷同的值停止交互,所以一旦 numbers 的值產生變更,也會轉變Python外面保留的初始值的記載。
那末處理計劃以下:
def foo(numbers=None): if numbers is None: numbers = [] numbers.append(9) print numbers
平日,當人們聽到這裡,年夜家會問另外一個關於默許值的成績。思慮上面的法式:
def foo(count=0): count += 1 print count
當我們運轉它的時刻,其成果完整是我們希冀的:
>>> foo() 1 >>> foo() 1 >>> foo(2) 3 >>> foo(3) 4 >>> foo() 1
這又是為啥呢?其機密不在與默許值被賦值的時刻,而是這個默許值自己。整型是一種弗成變的變量。跟 list 類型分歧,在函數履行的進程中,整型變量是不克不及被轉變的。當我們履行 count+=1 這句話時,我們並沒有轉變 count 這個變量原本的值。而是讓 count 指向了分歧的值。可是,當我們履行 numbers.append(9) 的時刻,我們轉變了原本的 list 。因此招致了這類成果。
上面是在函數裡應用默許值時會碰著的另外一種雷同成績:
def print_now(now=time.time()): print now
跟後面一樣,time.time() 的值是可變的,那末它只會在函數界說的時刻盤算,所以不管挪用若干次,都邑前往雷同的時光 — 這裡輸入的時光是法式被Python說明運轉的時光。
>>> print_now() 1373121487.91 >>> print_now() 1373121487.91 >>> print_now() 1373121487.91
* 這個成績和它的處理計劃在 Python 2.x 和 3.x 裡都是相似的,在Python 3.x 外面獨一的分歧,是外面的print 表達式應當是函數挪用的方法(print(numbers))。