2016-12-26 74 views
1

我在Python寫了這個小程序來顯示一個十進制整數作爲其數字的排序列表:矛盾輸出在Python

import math 
import sys 
import os 

l = [] 

def f(n): 
    if (math.floor(n/ 10) == 0): 
     l.append(n) 
     return l 
    else: 
     l.append(n%10) 
     return f(int((n - (n%10))/10)) 

def g(n): 
    return sorted(f(n)) 

print(g(1)) 
print ([1] == [1]) 
print (g(1) == g(1)) 

好像一旦運行,它應該回答[1], True, True
當我運行它,它給了我看似矛盾的答案[1], True, False。爲什麼會發生?

+0

Python不起作用,所以這樣的事情是可能的。 –

+4

@EliSadoff:「功能」一詞並不意味着你的想法。 Python沒有[*純函數*](https://en.wikipedia.org/wiki/Pure_function),就是你想說的。 –

+0

@MartijnPieters對不起,我的意思是說python不是純粹的功能。用純函數式語言中的g(1)== g(1)'將永遠是真實的。 –

回答

10

您正在更改全球l,然後返回已排序的副本。 l持續增長:

>>> g(1) 
[1] 
>>> l 
[1] 
>>> g(1) 
[1, 1] 
>>> l 
[1, 1] 
>>> g(1) 
[1, 1, 1] 
>>> l 
[1, 1, 1] 

[1, 1]不等於[1, 1, 1]

如果要在每次撥打g()時生成單元素列表,請不要使用全局列表。

+0

事實上,如果代碼本來是'f(1)== f(1)',它就可以工作:-D – 6502

+0

@ 6502:yup,因爲那麼返回的是對同一列表的引用,而不是副本。 –

1
print(g(1)) 
print(g(1)) 
print(g(1)) 

輸出:

[1] 
[1, 1] 
[1, 1, 1] 

由於您使用的是單一的全局列表l改變每次運行f並沒有得到復位時間。