2015-05-25 97 views
7

這是我的第一個問題,所以對不起... 我是一個初學python和編碼的一般,我想創建一個名爲'Map'的類,將有以下類變量:Python初學者類變量錯誤

class Map: 
    height = 11 
    width = 21 

    top = [['#']*width] 
    middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)] 
    field = top + middle + top 

b = Map() 

Shell: 
>>> middle = [['#']+[' ']*(width-2)+['#'] for i in range(height-2)] 
    NameError: name 'width' is not defined 

如果我把變量放在類之外, 我在做什麼錯?

感謝您的幫助。

+2

您是否瀏覽過[classes classes](https://docs.python.org/2/tutorial/classes.html)? – bereal

+0

b.width? b.height?因爲你在課外的地圖。看到這個帖子,它會幫助你更好地理解:http://stackoverflow.com/questions/68645/static-class-variables-in-python – Alex

+1

對我也適用 – Ladmerc

回答

7

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()) 

你選擇的是真的取決於你想要做什麼。

+0

因此...列表中的「for」循環函數無法訪問寬度變量? – Cookiesforhelp

+0

@Cookiesforhelp,完全是。 –

+0

謝謝你的時間和鏈接,但是,在python2例子中最後一個問題是變量丟失「字節數據」成爲另一個數字,因爲這很奇怪 – Cookiesforhelp