国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python中設置變量作為默認值時容易遇到的錯誤

Python中設置變量作為默認值時容易遇到的錯誤

2020-05-29 11:23Amir Rachum Python

這篇文章主要介紹了Python中設置變量作為默認值時容易遇到的錯誤,這是Python新手經常容易碰到的問題,且往往不會被輕易察覺到,需要的朋友可以參考下

思考一下下面的代碼片段:
 

?
1
2
3
def foo(numbers=[]):
  numbers.append(9)
  print numbers

在這里,我們定義了一個 list (默認為空),給它加入9并且打印出來。
 

?
1
2
3
4
5
6
>>> foo()
[9]
>>> foo(numbers=[1,2])
[1, 2, 9]
>>> foo(numbers=[1,2,3])
[1, 2, 3, 9]

看起來還行吧?可是當我們不輸入number 參數來調用 foo 函數時,神奇的事情發生了:
 

?
1
2
3
4
5
6
7
8
>>> 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里面保存的初始值的記錄。

那么解決方案如下:
 

?
1
2
3
4
5
def foo(numbers=None):
  if numbers is None:
    numbers = []
  numbers.append(9)
  print numbers

通常,當人們聽到這里,大家會問另一個關于默認值的問題。思考下面的程序:
 

?
1
2
3
def foo(count=0):
  count += 1
  print count

當我們運行它的時候,其結果完全是我們期望的:
 

?
1
2
3
4
5
6
7
8
9
10
>>> foo()
1
>>> foo()
1
>>> foo(2)
3
>>> foo(3)
4
>>> foo()
1

這又是為啥呢?其秘密不在與默認值被賦值的時候,而是這個默認值本身。整型是一種不可變的變量。跟 list 類型不同,在函數執行的過程中,整型變量是不能被改變的。當我們執行 count+=1 這句話時,我們并沒有改變 count 這個變量原有的值。而是讓 count 指向了不同的值。可是,當我們執行 numbers.append(9) 的時候,我們改變了原有的 list 。因而導致了這種結果。

下面是在函數里使用默認值時會碰到的另一種相同問題:
 

?
1
2
def print_now(now=time.time()):
  print now

跟前面一樣,time.time() 的值是可變的,那么它只會在函數定義的時候計算,所以無論調用多少次,都會返回相同的時間 — 這里輸出的時間是程序被Python解釋運行的時間。

?
1
2
3
4
5
6
>>> print_now()
1373121487.91
>>> print_now()
1373121487.91
>>> print_now()
1373121487.91

* 這個問題和它的解決方案在 Python 2.x 和 3.x 里都是類似的,在Python 3.x 里面唯一的不同,是里面的print 表達式應該是函數調用的方式(print(numbers))。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 欧美中文在线 | the蜜臀av入口 | 免费久久久久 | 亚洲在线精品 | 久草视频在线播放 | 午夜黄色影院 | 亚洲国产精品久久久 | 老司机福利在线视频 | 日韩成人在线观看 | 三区在线 | 国产精品日产欧美久久久久 | 日日操操 | 欧美日韩不卡 | 国内精品一区二区三区 | 久久久免费网站 | 一区二区三区视频免费 | 亚洲最大的黄色网 | 精品久久久久久 | 中文字幕日韩欧美一区二区三区 | 麻豆激情 | 亚洲一区二区三区免费观看 | 国外成人在线视频网站 | 欧美综合影院 | 自拍偷拍欧美 | 亚洲欧美另类在线 | 伊人精品成人久久综合软件 | 亚洲国产高清高潮精品美女 | 成人精品视频免费 | 亚洲二区在线观看 | 欧美一区二区三区免费 | 欧美一区二区三区在线观看视频 | 污视频免费网站 | 一本色道久久综合狠狠躁篇怎么玩 | a级毛片免费高清视频 | 亚洲免费视频一区 | 欧洲色视频 | 日本一区二区三区四区 | 激情欧美一区二区三区中文字幕 | 先锋影音av在线 | 国产精品无码久久久久 | 在线播放国产一区二区三区 |