2014-09-26 49 views
0

,如果你有基本的Python功能和輸出

def dog(x): 
    x = 5 
x = 7 
dog(x) 
print(x) 

將這種打印5或7?我可以看到爲什麼它會打印5,因爲x被重新分配,但是當我在終端運行它,我得到7

+0

我認爲它總是打印'7'。 – HuStmpHrrr 2014-09-26 20:44:48

回答

2

當你調用dog(x),你要複製你的變量x價值爲dog的變量x。但將dogx更改爲另一個值不會改變函數外部的x的值。它們是您賦予相同標識符的兩個單獨變量。

5

在函數體內定義的變量具有局部範圍,而在外部定義的變量具有全局範圍。

這意味着局部變量只能在聲明它的函數內部訪問,而全局變量可以通過所有函數在整個程序體中訪問。當你調用一個函數時,在它內部聲明的變量被引入到作用域中。因此,當您撥打dog(x)時,只需在dog中的x等於5

更好地瞭解見下面演示:

>>> def dog(x): 
...  x = 5 
...  print x+5 
... 
>>> x = 7 
>>> dog(x) 
10 
>>> x 
7 
0

這是因爲範圍。

使用dir您可以看到當前範圍中的名稱。以下是一些理解範圍概念的例子。

當啓動解釋:

>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__'] 

讓我們增加x變量:

>>> x=5 
>>> dir() 
['__builtins__', '__doc__', '__name__', '__package__', 'x'] 

什麼是與自變量的函數的範圍:

>>> def dog(y): 
... print dir() 
... 
>>> dog(1) 
['y'] 

正如你可以看到,x不在其中。所以,當你定義def dog(x)時,你以後使用的x只在函數的範圍之內。

如果你想使用x定義外dog,使用global關鍵字:

>>> def dog(y): 
... global x 
... print dir() 
... 
>>> dog(1) 
['y'] 

正如你所看到的,x仍然沒有在dog範圍限定。但是:

>>> x 
5 
>>> def dog(y): 
... global x 
... print x 
... 
>>> dog(1) 
5 

更多關於scoping rulesscopes and namespaces

1

當編寫X = 7,Python中創建一個整數對象7和名字「x」的分配給它具有全局範圍
當調用狗和通過x到它,要傳遞的指針整數對象7
內部狗,當你做X = 5,一個新的名字的「x」具有本地範圍(函數內)分至5
由於,你是它打印7

函數外部打印X 請注意,這隻發生在不可變對象(字符串,整數,元組等)和不可變對象(列表,字典)

如果x是一個列表:

DEF狗(X):
        x.append(5)
X = [7]
狗(x)的
打印(X)

輸出將是[7,5]