激情久久久_欧美视频区_成人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
主站蜘蛛池模板: 国产精品成aⅴ人片在线观看 | 毛片电影在线看 | 国产一级小视频 | 美女久久 | 美女羞羞视频网站 | 国产精品亚洲精品久久 | 色污视频在线观看 | 国产一区二区免费在线观看 | 成人免费入口 | 毛片网站视频 | 国产精品久久在线观看 | 国产精彩视频在线 | 亚洲资源在线播放 | 国产精品久久久久久久久久妇女 | 久久噜噜噜精品国产亚洲综合 | 巨乳激情 | 国产91九色 | 在线免费观看毛片视频 | 欧美在线小视频 | 天堂成人国产精品一区 | 深夜福利视频绿巨人视频在线观看 | 精品一区视频 | 成人在线视频播放 | 亚洲日本高清 | 久久久久久艹 | 一级免费观看 | 91精品国产乱码久久桃 | a网在线| 一级做受毛片免费大片 | 国产91精品久久久久久 | 成人在线观看网 | 免费淫视频 | 成年人免费黄色片 | 色欲香天天天综合网站 | 精品一区二区三区欧美 | av电影在线网站 | 国产一区二区三区四区五区在线 | 日本黄色一级电影 | 羞羞的网址 | 日本看片一区二区三区高清 | 超碰97人人艹 |