Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python旧值重新出现_Python_Sql_Recursion - Fatal编程技术网

Python旧值重新出现

Python旧值重新出现,python,sql,recursion,Python,Sql,Recursion,在我告诉某人我将字典导出到数据库(将选择的字典HTML页面导出到数据库的简单python脚本)后,我遇到了一个挑战,那就是将空间更少的摩尔斯电码转换成一个单词 e、 g。 通常,消息是:-.--(苹果),每个字符之间有空格。 但是,由于有一个数据库可以检查每一种可能性,新的输入将是:-。--…(苹果),中间没有空格 我编写了一个python脚本来实现这一点,但我发现了一个非常奇怪的现象,旧值(没有存储在任何变量中)再次出现 代码如下: import sqlite3 conn = sqlite3.

在我告诉某人我将字典导出到数据库(将选择的字典HTML页面导出到数据库的简单python脚本)后,我遇到了一个挑战,那就是将空间更少的摩尔斯电码转换成一个单词

e、 g。 通常,消息是:
-.--(苹果),每个字符之间有空格。
但是,由于有一个数据库可以检查每一种可能性,新的输入将是:
-。--…
(苹果),中间没有空格

我编写了一个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

..-
->
苹果,它

-.
->
苹果,我

我让它在SQL语句之前输出
mag
,它拥有苹果所有的可能性+新输入的可能性(因此它不是由SQL引起的)

我尝试在
while
循环的末尾添加
mag=[]
,但仍然不起作用


我曾在另一种语言中经历过类似的奇怪行为,这是由于修改解析到函数中的参数值引起的,因此我尝试将这些值复制到新变量中,但没有效果

Python默认参数只计算一次。当您附加到作为默认参数的列表(如
curwords
)时,默认参数将在随后的函数调用中更改

如果要在调用函数时自动获取空列表,而不提供
curwords
,请尝试以下操作:

def magic(curwords=None):
  if curwords is None: curwords = []
  # ...

有关更多信息,请参阅Python语言教程中的。

快速浏览,
curwords=[''']
对我来说很危险。有关更多信息,请参阅:@Kevin Thanke,这似乎是问题所在,我正在进一步调查,因为从初步检查来看,存在不一致之处(即,只有“苹果”导致了问题,“它”和“我”不会“停留在原地”)