程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java設計形式之模版辦法形式簡介

Java設計形式之模版辦法形式簡介

編輯:關於JAVA

Java設計形式之模版辦法形式簡介。本站提示廣大學習愛好者:(Java設計形式之模版辦法形式簡介)文章只能為提供參考,不一定能成為您想要的結果。以下是Java設計形式之模版辦法形式簡介正文


哪裡出成績了

  python 中,應用 global 會將全局變量設為本函數可用。同時,在函數外部拜訪變量會先當地再全局。

  在嵌套函數中,應用 global 會發生不合常理的行動。

  上代碼:

In [96]: def x():
b = 12
def y():
global a,b
a = 1
b = 2
y()
print "b =",b
....: 
In [97]: a = 111
In [98]: del b
In [99]: x()
b = 12
In [100]: a
Out[100]: 1
In [101]: b
Out[101]: 2

  而在函數 x() 中,沒有效 global,此時的b應用當地。所以 print 會打印當地 b

  為何會打印 12 ?還有 In[101]的 b 為 2 該怎樣說明?

  y(),應用的 global 居然沒把 x() 的 b = 12 導出去。

  在函數 y() 中,語句 global a,b 使a,b擴大為全局,所以,在最高層,就算沒有 b(In[98]),也會發生 b(In[101])。

  也就是說, global a,b ,會以為 a 和 b 是最外層的變量。

  再試一下:

In [102]: def x():
b = 12
def y():
global a,b
a = 1
y() 
print "b =",b
.....: 
In [103]: a = 111
In [104]: del b
In [105]: x()
b = 12
In [106]: a
Out[106]: 1
In [107]: b
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-107-3b5d5c371295> in <module>()
----> 1 b
NameError: name 'b' is not defined

  報錯了! y() global b 後沒賦值,頂層就沒有 b。這解釋,global 只是引入稱號,其實不做賦值等操作。

  global 不會管變量存不存在,只導入稱號,對該稱號的操作會反響到 ‘最高層稱號空間‘。

  再來:

In [109]: a = 111
In [110]: del b
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-110-745f2abe7045> in <module>()
----> 1 del b
NameError: name 'b' is not defined
In [111]: def x():
b = 12
def y():
global a,b
a = 1
print b
y()
print "b =",b
.....: 
In [112]: x()
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-112-7354d77c61ac> in <module>()
----> 1 x()
<ipython-input-111-c05fc67a1e82> in x()
5 a = 1
6 print b
----> 7 y()
8 print "b =",b
9 
<ipython-input-111-c05fc67a1e82> in y()
4 global a,b
5 a = 1
----> 6 print b
7 y()
8 print "b =",b
NameError: global name 'b' is not defined

   這就肯定了 內層y() 的 global 不會 導入 x() 的器械。

   那末,內層函數怎樣應用准確的外層函數的變量呢?

處理內層函數參數傳遞成績

  1、

  起首,若只是取值,則不須要做任何處置。

In [119]: def x():
.....: a = 12
.....: def y():
.....: print a
.....: y()
.....: 
In [120]: x()
12
In [121]: 

  在 y() 中,一旦為 a 賦值,a 立馬變外部變量。

In [121]: def x():
.....: a = 12
.....: def y():
.....: print "before a =",a
.....: a = 1
.....: print "then a =",a
.....: y()
.....: 
In [122]: x()
before a =---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-122-7354d77c61ac> in <module>()
----> 1 x()
<ipython-input-121-d8fbc0dba399> in x()
5 a = 1
6 print "then a =",a
----> 7 y()
8 
<ipython-input-121-d8fbc0dba399> in y()
2 a = 12
3 def y():
----> 4 print "before a =",a
5 a = 1
6 print "then a =",a
UnboundLocalError: local variable 'a' referenced before assignment

  一旦在函數 y() 的某處給 a 賦值,則在賦值前,python 會以為 a 不存在。

  同時發明 python2 的 print 會一個一個的 輸入。鑒於此,我又在 python3 中試了,發明他是 一路輸入。但這不是本文重點,折疊之。

In [7]: def x():
a = 1
def y():
print("before a=",a)
a = 10
print("then a=",a)
y()
...: 
In [8]: x()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-8-7354d77c61ac> in <module>()
----> 1 x()
<ipython-input-7-6e01e7317b24> in x()
a = 10
print("then a=",a)
----> 7 y()
<ipython-input-7-6e01e7317b24> in y()
a = 1
def y():
----> 4 print("before a=",a)
a = 10
print("then a=",a)
UnboundLocalError: local variable 'a' referenced before assignment

同時發明 python代碼運轉前 會先掃一遍代碼的,而不是純真的一行一行的履行。

  同時發明前往 UnboundLocalError,而不是 NameError。留意到 'unbound‘,這是官方概念。用 'unbound‘ 來描寫就是:global 會將頂層變量稱號 綁定 到當地變量稱號,同時變更,是為 '援用‘;python 檢測到 a = 1時,認識到 a 是當地的,所以 在 a '指向一個對象‘(由於python變量均為援用),之前 ,挪用 a 長短法 行動,但這類行動差別於於 NameError,就界說為 unbound local。

  2、

  應用 可變變量,如 list,dict

In [127]: def x():
.....: l = ["in msg"]
.....: def y():
.....: msg = l[0]
.....: print "msg =",msg
.....: l[:] = ["out msg"]
.....: y()
.....: print l[0]
.....: 
In [128]: x()
msg = in msg
out msg

  沒有報錯,完善!

  要留意 語句 l[:] = ["out msg"] ,應用切片賦值,不然,

In [129]: def x():
l = ["in msg"]
def y():
msg = l[0]
print "msg =",msg
l = ["out msg"]
y()
print l[0]
.....: 
In [130]: x()
---------------------------------------------------------------------------
UnboundLocalError Traceback (most recent call last)
<ipython-input-130-7354d77c61ac> in <module>()
----> 1 x()
<ipython-input-129-d44e750e285f> in x()
5 print "msg =",msg
6 l = ["out msg"]
----> 7 y()
8 print l[0]
9 
<ipython-input-129-d44e750e285f> in y()
2 l = ["in msg"]
3 def y():
----> 4 msg = l[0]
5 print "msg =",msg
6 l = ["out msg"]
UnboundLocalError: local variable 'l' referenced before assignment

  又出 UnboundLocalError 了,由於 第六行代碼 為 l 分派了 一個新的 list。

  3、

  應用參數傳遞。

In [136]: def x():
.....: a, b = 1, 2
.....: def y(a = a, b = b):
.....: a, b = 3, 4
.....: return a, b
.....: a, b = y()
.....: print a, b
.....: 
In [137]: x()
3 4

  留意,不要在默許參數上放 list等可變對象。

以上所述是小編給年夜家引見的PYTHON 中應用 GLOBAL激發的一系列成績,願望對年夜家有所贊助,假如年夜家有任何疑問請給我留言,小編會實時答復年夜家的。在此也異常感激年夜家對網站的支撐!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved