2017-10-09 91 views
0

我是Python的新手,我想了解何時可以修改函數中使用的變量。
在下面的示例中,綁定到x的對象不會被f修改,如我們在輸出中所看到的。我不明白爲什麼。 根據我的理解,當我們在f中做x.append(4)時,我們修改綁定到名稱x的對象。但看起來情況並非如此,因爲產出。我的錯誤在哪裏?:Python:爲什麼對象沒有被函數修改?

我是否缺少全局變量vs局部變量?

當我們撥打f時是否有對象的副本?

我的問題類似於this question。然而,結論對我來說並不明確,它並沒有幫助我理解我錯在哪裏。

def f(x): 
    x = [0,1,2,3] 
    x.append(4) 
    print('In f():', x) 

x = [0,1,2,3] 
print('Before:', x) 
f(x) 
print('After :', x) 

輸出

Before: [0, 1, 2, 3] 
In f(): [0, 1, 2, 3, 4] 
After : [0, 1, 2, 3] 
+3

'x = [0,1,2,3]' - 你這樣做**功能**也。刪除該行,如果不立即用新對象對其進行遮蔽,則會看到參數值* does *被修改。 *「我們修改綁定到名稱'x'的對象」* - 是的,但是您明確綁定了不同的對象。 – jonrsharpe

+1

您並未修改全局名稱空間中的'x',而是修改函數名稱空間中新創建的''x'。它們是不同的對象,即使它們具有相同的名稱(在不同的名稱空間中)。 –

+0

https://nedbatchelder.com/text/names.html – chepner

回答

1

當你做這樣的說法:

x = [0,1,2,3] 

f身體內部,它創造了新的x只是爲f一個品牌。

您可以通過打印變量的id檢查這個自己:

>>> def f(x): 
... x = [0,1,2,3] 
... x.append(4) 
... print('Inside f, x is: {} with id: {}'.format(x, id(x))) 
... 
>>> x = [0,1,2,3] 
>>> print('{} {}'.format(x, id(x))) 
[0, 1, 2, 3] 139706697083592 
>>> f(x) 
Inside f, x is: [0, 1, 2, 3, 4] with id: 139706697093064 

現在,使用從fx,剛剛擺脫賦值操作:

>>> def f2(x): 
...  x.append(4) 
...  print('Inside f2, x is: {} with id: {}'.format(x, id(x))) 
... 
>>> print('{} {}'.format(x, id(x))) 
[0, 1, 2, 3] 139706697083592 
>>> f2(x) 
Inside f2, x is: [0, 1, 2, 3, 4] with id: 139706697083592 
>>> x 
[0, 1, 2, 3, 4] 

你不會認爲id是一樣的,更重要的是,x以外的函數的值也發生了變化。

+0

謝謝布爾漢 –

0

如果你想改變x的值試試這個:

def f(x): 
    x.append(4) 
    print('In f():', x) 

x = [0,1,2,3] 
print('Before:', x) 
f(x) 
print('After :', x) 

通過這樣做,你會通​​過X的功能和編輯。

0

您在函數中重新聲明x。函數內部的x與函數外部的x不同。此外,你不能從函數內部調用x。所以爲了使你的代碼正常工作,你需要從你的函數中刪除x.For更多信息請參閱Python variable scope

相關問題