從docs:
名稱指代對象。名稱是通過名稱綁定操作引入的。程序文本中名稱的每次出現都指的是在包含該用法的最內層功能塊中建立的該名稱的綁定。
塊是一塊Python程序文本,作爲一個單元執行。以下是塊:模塊,函數體和類定義。交互式輸入的每個命令都是一個塊。腳本文件(作爲標準輸入給解釋器的文件或作爲解釋器的命令行參數指定的文件)是代碼塊。腳本命令(在解釋器命令行中使用「-c」選項指定的命令)是一個代碼塊。傳遞給內建函數eval()和exec()的字符串參數是一個代碼塊。
代碼塊在執行框架中執行。一個框架包含一些管理信息(用於調試),並確定代碼塊執行完成後執行的地點和方式。
作用域定義塊內名稱的可見性。如果在塊中定義了局部變量,則其作用域包含該塊。如果定義發生在功能塊中,則範圍擴展到定義塊中包含的任何塊,除非包含的塊爲該名稱引入了不同的綁定。 在類塊中定義的名稱範圍限於類塊;它沒有擴展到方法的代碼塊 - 這包括理解和生成器表達式,因爲它們是使用函數範圍實現的。這意味着以下將失敗:
class A:
a = 42
b = list(a + i for i in range(10))
在python3列表譜曲都有自己的範圍,而不是python2在您的代碼將工作原樣。
如果你把使用python2下面的例子中,你可以看到變量泄漏名單補償的範圍如何可能會導致一些問題:
class A:
a = 42
b = [a for a in range(10)]
a = A()
print(a.a)
9
您有幾種選擇,你可以使用__init__
創建實例屬性:
class Map:
def __init__(self):
self.height = 11
self.width = 21
self.top = [['#']*self.width]
self.middle = [['#']+[' ']*(self.width-2)+['#'] for i in range(self.height-2)]
self.field = self.top + self.middle + self.top
m=Map()
print(m.field)
使用方法:
class Map:
@staticmethod
def meth():
height = 11
width = 21
top = [['#']*width]
middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)]
field = top + middle + top
return field
b = Map()
print(b.meth())
你選擇的是真的取決於你想要做什麼。
您是否瀏覽過[classes classes](https://docs.python.org/2/tutorial/classes.html)? – bereal
b.width? b.height?因爲你在課外的地圖。看到這個帖子,它會幫助你更好地理解:http://stackoverflow.com/questions/68645/static-class-variables-in-python – Alex
對我也適用 – Ladmerc