2015-11-12 39 views
3

我認爲輸出應該是x = 5,y = 3。但是,當我嘗試在jes中執行它時,它顯示x=3y=5交換功能輸出不同於預期的

我的交換功能如下:

def swap (x,y):  
    temp=x 
    x=y 
    y=temp 

而且從我的司機功能我叫swap()

def driver():  
    x=3 
    y=5 
    swap(x,y) 
    print x 
    print y 

我想知道爲什麼無法按預期的輸出?

+1

我不認爲這個問題是它被標記爲的一個重複。這個問題有更多關於範圍界定和基本功能的功能。 –

回答

-1

整數在python中是不可變的。您在本地範圍內設置了yxxy,但不修改對傳入的初始整數的引用。通過迴歸是通過某種容器對象是可變的,包含要交換的東西引用:

def swap(container): 
    container[0], container[1] = container[1], container[0] 

然後調用它像這樣:

x = 3 
y = 5 
container = [x,y] 
swap(container) 

FWIW,掉在python可以在一行中實現簡單地說:

x, y = y, x 

無論如何,這在大多數情況下可能在語法上更清晰。

Python passing an integer by reference

1

至於其他的答案都建議看,這確實不需要的功能。既然你已經決定使用它們,你不妨嘗試一下更多關於scopes的內容。

爲了保留的交換價值,你需要回報他們,否則的swap()執行後,他們迷路

def swap (x,y): 
    temp=x 
    x=y 
    y=temp 
    return x, y # must return the swapped values. 

然後,在功能,你叫swap()你將返回的值分配給您交換的變量:

def driver(): 
    x=3 
    y=5 
    x, y = swap(x,y) # re-assign values 
    print x 
    print y 

Runni NG driver()現在會給你交換價值:

5 
3 

這是因爲在功能swap()變量xy你作爲參數傳遞的本地處理,該功能,只有swap可以看到他們的價值。如果你不返回這個值,它會丟失並被遺忘。

2

嗯,這是不是在python大問題,你可以返回多個值,如嘗試這個片段,它可能會幫助你。

def swap(a,b): 
    return (b,a) 

def driver(x,y): 
    print "Previous x=",x,"y=",y 
    x,y = swap(x,y) 
    print "Now x=", x, "y=",y 

driver(3,5) 
+0

爲什麼我的回答是downvoted,它回答了這個問題。提出問題的人剛剛提到swap不起作用,所以我只給了他一個工作片段。 –

-1

python賦值改變了對象的身份而不是它的值(除非你在改變內容)。值得注意的是,根據Python Data Model

每個對象都有一個標識,一個類型和一個值。

因此,交換swap內的身份不會改變driver內的身份。此外,python不允許你改變不可變類型的值,所以沒有其他可能的方法來交換swap方法中的值。

+0

@Downvoter,你有理解Python數據模型的問題嗎? – Abhijit

+0

我不是下來的選民,但我會說這個答案很難理解,對於明顯是初學者的OP沒有多大用處。 –

+0

@PaulRooney:但這是每個初學者都需要知道的概念(保證我自己是初學者)。但是這是一個觀點 – Abhijit