回答
讓我們用一個簡單的例子對於同樣的問題:
a = 'something'
def boo():
a = a
boo()
失敗的原因是在Python任務,沒有伴隨global
或nonlocal
聲明,表示該分配的名稱是本地的當前範圍。這不僅發生在函數中,而且發生在類定義中。
這意味着您不能爲全局變量和本地變量使用相同的名稱並將它們同時使用。您可以使用替代方法從亞倫Digulia的答案,或者使用不同的名稱:
def make_class(_a):
class A(object):
a = _a
return A
似乎都工作正常(在Python 2.5,至少):
>>> def make_class(a):
... class A(object):
... _a = a
... return A
...
>>> make_class(10)._a
10
>>> def make_class(b):
... class B(object):
... def get_b(self):
... return b
... return B
...
>>> make_class(10)().get_b()
10
作品就好了:
>>> def make_class(a):
class A(object):
_a=a
return A
>>> make_class('df')
<class '__main__.A'>
>>> make_class('df')._a
'df'
順便說一句,function
在Python中並不是一個保留關鍵字。
我的不好。我知道Python,誠實! – joeforker 2009-09-18 15:47:18
@joeforker,所以接受SilentGhost的答案已經! - ) – 2009-09-18 16:49:13
嘗試
def make_class(a):
class A(object): pass
A.a=a
return A
錯誤你得到(NameError: name 'a' is not defined
)是因爲在類名a
陰影參數的功能a
;因此在代碼中嘗試「a = a」時沒有定義a
。換句話說,右邊a
是不是a
來自def
;相反,Python在類A
中查找它,因爲a
已在作業左側提到。
這變得更加乾淨,功能:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
print 'b:',x
b()
a(2)
def c():
x = x
顯然,第一印刷應打印2,而不是1,所以參數的a
x
絕影全局變量x
。 b
在x
被稱爲a
的參數的範圍內定義,因此打印工作正常。
但是,如果您嘗試致電c
,則會得到UnboundLocalError: local variable 'x' referenced before assignment
,因爲Python不會自動綁定全局變量。要解決此問題,您必須在分配前添加global x
。
你的情況大致如下:
x = 1
def a(x):
print 'a:',x
x = 3
def b():
x = x
print 'b:',x
b()
a(2)
雖然印刷x
在上面的例子中的工作,任務不工作。這是確保變量不泄漏的安全措施。解決的辦法是使用默認參數設置爲「複製」變到b
的範圍:
x = 1
def a(x):
print 'a:',x
x = 3
def b(x=x):
x = x
print 'b:',x
b()
a(2)
解決你的問題,你需要告訴Python的‘使參數的A
make_class
可見a
’和在嘗試分配課程的a
字段之前,您需要這樣做。這在Python中是不可能的。如果你可以使a
可見,那麼賦值會改變參數,而不是字段,因爲Python無法區分這兩個。
由於您無法將其顯示,因此沒有a
可讀,因此NameError
。
請參閱here瞭解Python中名稱範圍的解釋。
-1您將得到該代碼的語法錯誤,因爲您打開類A並且不縮進以下行。放入一個縮進的通行線,你會沒事的。 – 2009-09-18 16:16:53
糟糕。添加了缺少的「通行證」。 – 2009-09-21 07:09:17
- 1. 爲什麼我可以在Ruby中爲自己分配一個未定義的變量並獲得零?
- 2. 爲什麼我不能將location.hash分配給一個變量?
- 3. C#爲什麼我不能爲自己的類編寫自定義的IEnumerator
- 4. 爲什麼Pagingnation類的變量不能分配?
- 5. 爲什麼我不能在子類中分配變量?
- 6. 爲什麼不能將靜態類變量分配給堆棧?
- 7. 爲什麼模式匹配定義在Haskell中不能成爲閉包?
- 8. 爲什麼Elixir允許使用未定義變量的閉包?
- 9. 爲什麼我必須在閉包中定義一個閉包訪問變量時聲明一個函數?
- 10. C99標準是否允許爲自己分配一個變量?
- 11. 爲什麼我不能在自定義對象中引用一個變量?
- 12. 爲什麼變量有時不分配?
- 13. 爲什麼get_posts()不能處理自定義分類?在WordPress
- 14. 爲什麼我不能將一個wordpress函數分配給一個變量?
- 15. 爲什麼一個結構不能成爲自己的成員?
- 16. 爲什麼你不能在Regexes中定義你自己的自定義charclasses?
- 17. 爲什麼結構類型被定義爲自己的名字?
- 18. 爲什麼不能將不可變的Map實體類定義爲個案類?
- 19. 爲什麼不分配一個int到f32變量編譯?
- 20. 爲什麼我們不能將常量變量定義爲靜態變量?
- 21. 爲什麼我不能將父類分配給子類類型的變量?
- 22. 爲什麼將一個IIFE分配給一個變量?
- 23. 爲什麼我不能創建一個自動變量數組?
- 24. 爲什麼DataFlow變量只能分配一次
- 25. 爲什麼我不能在JavaScript中的函數中分配一個變量?
- 26. 爲什麼我不能直接分配變量值?
- 27. 爲什麼我不能將循環分配給變量?
- 28. 爲什麼我不能將Scala對象分配給Java變量?
- 29. 爲什麼右值不能分配到constexpr參考變量
- 30. 爲什麼我不能在try塊中分配對象變量?
我試圖做A = A類中,如在默認的函數參數,那是行不通的。 – joeforker 2009-09-18 15:48:51