Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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_Python 3.x_Towers Of Hanoi - Fatal编程技术网

河内Python之塔:局部和全局变量的使用改变了输出

河内Python之塔:局部和全局变量的使用改变了输出,python,python-3.x,towers-of-hanoi,Python,Python 3.x,Towers Of Hanoi,所以,我正在用Python编写河内塔算法,其中3个堆栈表示为列表。代码如下: def move(stack, inter_stack, final_stack): disk=stack.pop() final_stack.append(disk) print(stack, inter_stack, final_stack) def moveDisks(n,start,end,inter): if n==1: move(start, inter,

所以,我正在用Python编写河内塔算法,其中3个堆栈表示为列表。代码如下:

def move(stack, inter_stack, final_stack):
    disk=stack.pop()
    final_stack.append(disk)
    print(stack, inter_stack, final_stack)

def moveDisks(n,start,end,inter):
    if n==1:
        move(start, inter, end)
    else:
        moveDisks(n-1,start,inter,end)
        move(start, inter, end)
        moveDisks(n-1,inter,end,start)

n = input("Enter the # of blocks: ")
n = int(n)
start=[]
inter=[]
end=[]
for i in range(n):
   start=start+[n-i]
moveDisks(n,start,end,inter)
如果我以n=3运行此代码,Python给出的结果如下:

[3, 2] [] [1]
[3] [1] [2]
[] [3] [2, 1]
[] [2, 1] [3]
[2] [3] [1]
[] [1] [3, 2]
[] [] [3, 2, 1]
在这个输出中,可以清楚地看到堆栈无序。但是,如果我替换该行

print(stack, inter_stack, final_stack)

代码以正确的顺序输出堆栈:

[3, 2] [] [1]
[3] [2] [1]
[3] [2, 1] []
[] [2, 1] [3]
[1] [2] [3]
[1] [] [3, 2]
[] [] [3, 2, 1]

考虑到两组变量都具有相同的值,第二种方法就是使用全局变量,为什么会发生这种情况?

当您递归时,您会通过这两个调用更改堆栈的含义:

moveDisks(n - 1, start, inter, end)
moveDisks(n - 1, inter, end, start)
请注意更改顺序。因此内部
move()


每次都会引用不同的列表。

那么为什么打印(开始、中间、结束)会给出正确的顺序?既然意思在变,那么这句话是不是也应该按错误的顺序打印呢?或者,不管递归内部的含义发生了变化,它总是采用起始、中间和结束的原始含义吗?需要理解的是,您缺少的是,变量只是名称,它们仅在适当的上下文中有效。由于
start、inter、end
move
中的全局变量,因此它们的上下文是全局的,其含义不会因上下文而改变。因此,您认为它们在您的打印中是正确的。但是在
moveDisks
中,这些same名称是局部的,因此根据调用方法的方式而变化。
moveDisks(n - 1, start, inter, end)
moveDisks(n - 1, inter, end, start)
print(stack, inter_stack, final_stack)