在我告诉某人我将字典导出到数据库(将OPTED字典HTML页面导出到数据库中的简单python脚本)后,我设置了一个挑战,它是将无空格摩尔斯代码转换为单词。
e.g。
通常消息是:.- .--. .--. .-.. .
(apple),每个字符之间有一个空格。
但由于有一个数据库可以检查每种可能性,新的输入将是:.-.--..--..-...
(apple),中间没有空格。
我写了一个python脚本来做到这一点,但我发现了一个非常奇怪的现象,旧的值(它们没有存储在任何变量中)再次出现。
代码如下:
import sqlite3
conn = sqlite3.connect('english_dictionary.db')
c = conn.cursor()
#Morse code alphabet
mc = {'.-' : 'a', '-...' : 'b', '-.-.' : 'c', '-..' : 'd', '.' : 'e', '..-.' : 'f', '--.' : 'g', '....' : 'h', '..' : 'i', '.---' : 'j', '-.-' : 'k', '.-..' : 'l', '--' : 'm', '-.' : 'n', '---' : 'o', '.--.' : 'p', '--.-' : 'q', '.-.' : 'r', '...' : 's', '-' : 't', '..-' : 'u', '...-' : 'v', '.--' : 'w', '-..-' : 'x', '-.--' : 'y', '--..' : 'z'}
#Recursive function - input, current words, current index, current_word
def magic(inp, curwords=[''], curindex=0, current_word=''):
#print 'inp: "%s", curwords = %s, curindex = %i, current_word = "%s"' % (inp, str(curwords), curindex, current_word)
#If the function is being called with an empty input, then this word has been finished, so set it up for a new one
if inp == "":
curwords.append('')
curindex += 1
return curwords,curindex
#Finding valid Morse code letters
for i in range(1, len(inp)+1):
#print 'Current: %i in (1, %i)' % (i, len(inp)+1)
if inp[:i] in mc:
#print 'Morse Code: "%s" -> %s in (1, %i)' % (inp[:i],mc[inp[:i]], len(inp)+1)
curwords[curindex] = current_word + mc[inp[:i]]
curwords,curindex = magic(inp[i:], curwords, curindex, current_word + mc[inp[:i]])
#else:
#print 'Not Morse Code: "%s" in (1, %i)' % (inp[:i], len(inp)+1)
return curwords,curindex
while 1:
x = raw_input('> ')
mag = magic(x)[0]
for row in c.execute('SELECT DISTINCT word FROM dictionary WHERE LOWER(word) IN %s' % (str(tuple(mag)))):
print row[0]
(请询问您是否希望更深入地解释部分代码)
问题:
如果我输入..-
,则会返回It
如果我输入--.
,则会返回Me
(两者都是正确的)
但是如果我.-.--..--..-...
,它会返回Apple
(再次,正确,但这里是它破坏的地方)
现在,如果我在检查Apple
后执行任何莫尔斯代码,则会返回Apple
。
e.g。
(按顺序运行)
> ..-
- > It
> --.
- > Me
> .-.--..--..-...
- > Apple
> ..-
- > Apple, It
> --.
- > Apple, Me
我在SQL语句之前输出mag
,它具有apple具有的所有可能性+新输入的可能性(因此它不是由SQL引起的)。
我尝试在mag = []
循环结束时添加while
,但仍然无效。
我在不同的语言中经历了与此类似的奇怪行为,这是由修改解析为函数的参数的值引起的,所以我尝试将值复制到新变量,但无济于事。
答案 0 :(得分:0)
Python默认参数仅评估一次。当您附加到作为默认参数的列表(如curwords
)时,默认参数将在后续调用函数时更改。
如果您想在不提供curwords
的情况下调用该函数时自动获取空列表,请尝试以下操作:
def magic(curwords=None):
if curwords is None: curwords = []
# ...
有关更多信息,请参阅Python语言教程中的Default Argument Values。