Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/330.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_Function - Fatal编程技术网

Python:生成与输入同名的变量的函数

Python:生成与输入同名的变量的函数,python,function,Python,Function,对于可能出现的标题混淆,我深表歉意。我将尽力说明我的问题 背景: 我刚刚完成了一个有趣的编码问题,在这个问题上,我被要求编写一个函数来简化方向列表 输入看起来像[“北”、“南”、“南”、“东”、“西”、“北”、“西”] 相邻的“南”“北”和“东”“西”都应删除,因为向北然后立即向南是没有意义的。清单应该简化,直到不能再简化为止 例如: ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"] 应简化为 ['WEST'] Dumm

对于可能出现的标题混淆,我深表歉意。我将尽力说明我的问题

背景:

我刚刚完成了一个有趣的编码问题,在这个问题上,我被要求编写一个函数来简化方向列表

输入看起来像
[“北”、“南”、“南”、“东”、“西”、“北”、“西”]

相邻的
“南”“北”
“东”“西”
都应删除,因为向北然后立即向南是没有意义的。清单应该简化,直到不能再简化为止

例如:

["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
应简化为

['WEST']
Dummy OP编写了一个笨拙的函数来实现它。但我的问题是关于其他人发布的一个非常聪明的答案

代码:

def dirreduce(arr):
dir=”“.加入(arr)
目录2=目录替换(“南北”)。替换(“南北”)。替换(“东西”)。替换(“东西”)。替换(“东西”)
dir3=dir2.split()
如果len(dir3)
我玩过它,看到了它的工作原理,但就是不知道它是如何工作的

我看到在return语句中,它应该再次运行,除非结果的长度与输入的长度相同,这是可以理解的。但是代码使用了
dirreduce(dir3)
,这在我看来是错误的

如果我运行
dirreduce(dir3)
,那么我的输入将是
dir3
,但是在函数的框架内,会创建另一个
dir3
。因此,现在当函数转到最终返回语句时,如果len(dir3),则返回dirreduce(dir3)。由于
len(dir3)==len(dir3)”,它只会返回
dir3`

据我所知,该函数将运行两次,每次输入最多运行一次,这不是事实。那么我的理解哪一部分是错误的呢


抱歉这么多的话,我想这毕竟是个简单的问题。肯定有一件非常基本的事情我弄错了。

不同堆栈帧中的局部变量彼此完全不相关,即使它们共享相同的名称。每个递归调用都会创建一个新的堆栈帧,因此一个调用中的
dir3
与另一个调用中的
dir3
完全不同

假设您有一个非递归函数,它只将路径减少了一步:

def dirReducOneStep(arr):
    dir = " ".join(arr)
    dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
    dir3 = dir2.split()
    return dir3

print(dirReducOneStep(dirReducOneStep(dirReducOneStep(path))))

唯一的区别是
dirreduce
在简化的路径上调用自身,而不是强制调用方决定是否在以前的输出中再次调用它。

不同堆栈帧中的局部变量彼此完全无关,即使它们共享相同的名称。每个递归调用都会创建一个新的堆栈帧,因此一个调用中的
dir3
与另一个调用中的
dir3
完全不同

假设您有一个非递归函数,它只将路径减少了一步:

def dirReducOneStep(arr):
    dir = " ".join(arr)
    dir2 = dir.replace("NORTH SOUTH",'').replace("SOUTH NORTH",'').replace("EAST WEST",'').replace("WEST EAST",'')
    dir3 = dir2.split()
    return dir3

print(dirReducOneStep(dirReducOneStep(dirReducOneStep(path))))

唯一的区别是,
dirreduce
在简化的路径上调用自己,而不是强迫调用方决定是否在以前的输出中再次调用它。

这是一个基本概念。每个函数都有自己的堆栈,或者说作用域

你可以想象一个函数是一个盒子。局部变量在框内。如果有很多函数,那么就有很多盒子。每个盒子都有自己的局部变量。这就像:

BoxA
--variable_a
BoxB
--varibale_a
虽然这两个变量的名称相同,但它们位于不同的框中。因此,它们完全不同


此外,BoxA(实际上是functionA)无法访问BoxB中的变量_a,它超出了它的范围,因此即使这两个变量具有相同的名称也是安全的。

这是一个基本概念。每个函数都有自己的堆栈,或者说作用域

你可以想象一个函数是一个盒子。局部变量在框内。如果有很多函数,那么就有很多盒子。每个盒子都有自己的局部变量。这就像:

BoxA
--variable_a
BoxB
--varibale_a
虽然这两个变量的名称相同,但它们位于不同的框中。因此,它们完全不同


此外,BoxA(实际上是function)无法访问BoxB中的变量_a,它超出了它的范围,因此即使这两个变量具有相同的名称也是安全的。

dir3
是每个函数执行的局部变量,它们彼此无关。@juanpa.arrivillaga感谢您的快速响应。请你详细说明一下好吗。函数内部生成的
dir3
是局部变量吗?哪个与哪个无关?当return语句计算
len(dir3)
时,它不是已经被更改为局部变量了吗?对于
['NORTH'、'WEST'、'SOUTH']
@kyrill,此解决方案失败,因为它们只有在彼此相邻时才会被删除。抱歉说得不够清楚。这很无聊:)
dir3
是每个函数执行的局部变量,它们彼此无关。@juanpa.arrivillaga感谢您的快速响应。请你详细说明一下好吗。函数内部生成的
dir3
是局部变量吗?哪个与哪个无关?当return语句计算
len(dir3)
时,它不是已经被更改为局部变量了吗?对于
['NORTH'、'WEST'、'SOUTH']
@kyrill,此解决方案失败,因为它们只有在彼此相邻时才会被删除。抱歉说得不够清楚。那太无聊了:)我认为第二个问题其实没那么有趣。其最优解在}(n)时间和}(logn)辅助空间中运行。然而,原始问题的给定解决方案需要ц(n^2)时间,尽管只有ц(1)空间(假设尾部调用优化,Python的情况并非如此,因此实际上是ц(n)空间)。另一种解决方案需要}(n)时间和ц(n)空间(以维持堆栈)