2011-12-26 156 views
1

多年來,我一直接觸C/C++/Java的語法,Python變量的定義方式讓我感到困惑。任何人都可以描述q中提到的三種不同之處嗎?Python:全局變量與前綴爲「self。」的變量與局部變量之間有什麼區別?

+1

首先。 Python變量不是「已定義」的。這可能是你的大部分問題。你是否被「全球」與「本地」混爲一談?這似乎不太可能。例如,你可以寫下你認爲你知道你有什麼具體的**問題嗎?如果你提供了什麼使你感到困惑的細節,這將有所幫助。代碼示例可以幫助您列出有關令人困惑的代碼的具體內容。 – 2011-12-26 20:19:08

+0

我主要困惑於「自我」如何進入全球與本地領域的畫面...... – 2011-12-26 20:20:02

+0

創建變量的術語是「創造」。賦值語句創建一個變量。 – 2011-12-26 20:21:05

回答

3

self作品就像this從C++和Java。您將獲得一個對象的引用,然後您可以使用.運算符(C++中的->)訪問該對象。

在Python訪問實例變量的唯一方法是通過明確地self。實例變量是而不是與本地或全局變量位於相同的「正常」範圍內。

+0

嘿,這是否意味着你*無法*根據上下文*使用local/global描述實例變量,或者它們可以是* local *或* global? – 2011-12-26 21:24:58

+2

@KaitlynMcmordie:在python中,如果你執行'a = 10',你總是設置一個名爲'a'的局部變量。在C++中,執行相同的操作可能會設置一個局部變量或一個實例變量,這取決於如何聲明'a'。在Python中獲取/設置一個intance變量的唯一方法是通過self:'self.a = 10' – hugomg 2011-12-26 21:28:11

+0

我仍然感到困惑,因爲名稱「instance」變量似乎是矛盾的...如果實例變量被更新在至少一個實例化已經修改它的\ *所有\ *運行時實例化的時候,是不是更適合稱它爲「實例無關」變量?或者爲什麼不把它稱爲一個靜態變量,因爲它基本上看起來就是這樣... – 2011-12-26 21:32:39

6

全局變量就是這樣 - 一個變量,全局可訪問的。局部變量是隻能被當前範圍訪問的變量,例如單個函數定義中使用的臨時變量。實例變量(例如:當使用前綴self.時)是與對象的特定實例關聯的數據。當然,您也可以使用object.x來引用對象之外的實例對象,其中object是對該對象的引用。

如果一個變量與self前綴,它既不是本地還是全球性的。它是對象特定實例的組成部分。粗略地說,實例變量表示特定對象的屬性。

在以下示例中,lx是一個局部變量,局部的方法greetgx是一個全局變量,可以在模塊的任何位置訪問,ix是一個實例變量,可以爲對象的每個實例都有唯一的值。當在對象定義的內部引用時,您會參考ix,前綴爲self,並且當對象外部帶有對象引用的前綴時。

gx = "hello" 
class Foo: 
    def __init__(self, who): 
     self.ix = who 
    def greet(self): 
     lx = "%s, %s" % (gx, self.ix) 
     return lx 

foo = Foo("world") 
print foo.greet() 
print foo.ix 
2

有時候真的有用返回到第一原則:

當我們談論一個變量是本地或全局,我們指的是它的「範圍」(或上下文)。函數內的變量被認爲是本地的函數。以下是Swaroop的優秀導遊的插圖, 'A Byte of Python':

x = 50 

def func(x): 
    print('x is', x) 
    x = 2 
    print('Changed local x to', x) 

func(x) 
print('x is still', x) 

輸出:

x爲50

改變局部x 2

X仍然是50

下一步是的全球變量如何穿過內部和外部之間的函數的上下文的說明:

x = 50 

def func(): 
    global x 

    print('x is', x) 
    x = 2 
    print('Changed global x to', x) 

func() 
print('Value of x is', x) 

輸出:

x是50

改變全局x到2

x的值是2

這就是它的全部。

當我們利用Python的面向對象編程方面時,'self'的概念就變得相關了。類實例和實例被認爲是'對象'和'self'。前綴允許我們的代碼區分是否引用本地/全局變量或對象的屬性。

再一次,這個概念被禪宗般簡單地解釋了Swaroop