英文:
python - 3 Turing Machine script, getting errors on an undefined variable, even though I assigned it
问题
#图灵机在Python中的代码部分
#脚本
index = 5
state = 0
tape = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
def MoveRight():
index += 1
def MoveLeft():
index -= 1
def read():
global state # 在此处添加此行以引用全局变量
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight()
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
#运行脚本
read()
英文:
I'm working on a Turing machine in python and i'm getting an error for an undefined variable even though I have assigned it. Any help?
the exact error is
Traceback (most recent call last):
File "main.py", line 71, in <module>
read()
File "main.py", line 20, in read
if state == 0:
UnboundLocalError: local variable 'state' referenced before assignment
my code is:
#Turing Machine In Python
#by adrian wheeler
#the script
index = 5
state = 0
tape = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
def MoveRight():
index += 1
def MoveLeft():
index -= 1
def read():
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
#running the script
read()
I'm very sure I defined the variable before using it.
I've tried moving it around to different spots, and searched up a fix on google, I still can't seem to find the fix. I am using an IDE as i'm at school, maybe that's the problem, please help?
答案1
得分: 0
以下是您要翻译的内容:
默认情况下,导致此错误的原因是函数无法访问在它们之外定义的变量。
有两种解决方法。
第一种方法是在函数开头键入global state
,以声明您正在引用全局变量state。这将告诉程序使用全局state变量,而不是尝试访问一个根据其了解可能不存在的变量。
def MoveRight():
global index
index += 1
def MoveLeft():
global index
index -= 1
def read():
global state
global tape
global index
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight()
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
虽然第一种方法有效,但首选方法是将状态作为参数传递给函数。这样做的好处是它被复制,因此如果被编辑,不会在全局范围内更改它。
def MoveRight(index):
index += 1
def MoveLeft(index):
index -= 1
def read(state, tape, index):
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight(index)
read(state, tape, index)
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight(index)
read(state, tape, index)
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft(index)
read(state, tape, index)
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft(index)
read(state, tape, index)
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight(index)
read(state, tape, index)
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight(index)
read(state, tape, index)
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight(index)
read(state, tape, index)
read(state, tape, index)
英文:
The reason for this error is that by default functions can't access variables that are defined outside them.
There are 2 ways to solve this.
The first is to just declare that you are referencing the global variable state by typing global state
at the beginning of the function. This will tell the program to use the global state variable instead of trying to access a variable that for as it knows, does not exist.
def MoveRight():
global index
index += 1
def MoveLeft():
global index
index -= 1
def read():
global state
global tape
global index
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight()
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
Although the first method works, the preferred way is to pass the state as an argument into the function. The good part about this is that it is being made a copy, so if it's edited it won't change it on a global scale.
def MoveRight(index):
index += 1
def MoveLeft(index):
index -= 1
def read(state, tape, index):
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight(index)
read(state, tape, index)
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight(index)
read(state, tape, index)
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft(index)
read(state, tape, index)
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft(index)
read(state, tape, index)
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight(index)
read(state, tape, index)
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight(index)
read(state, tape, index)
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight(index)
read(state, tape, index)
read(state, tape, index)
答案2
得分: 0
在你的函数顶部将state
、index
和tape
声明为局部变量:
每个函数都是一个新的命名空间。这意味着即使变量state
在外部作用域中定义了,它在函数中也未定义。为了解决这个问题,我们可以使用Python的global
关键字,确保在函数内部定义了这些变量。
global
关键字的简要解释:
令人惊讶的是,这段代码包含一个错误:
foo = 1
def do_something():
foo = 2 # 哎呀... foo 未定义
让我们来修复它:
foo = 1
def do_something():
global foo # 确保 foo 是全局的
foo = 2 # 这个工作正常!
所以,回到你的代码:我们需要在所有的函数顶部放置全局关键字,如下所示:
# 在Python中的图灵机
# 由Adrian Wheeler编写
# 脚本
index = 5
state = 0
tape = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
def MoveRight():
global index # 确保我们的变量是全局的!
index += 1
def MoveLeft():
global index # 确保我们的变量是全局的!
index -= 1
def read():
global state, index, tape # 确保我们的变量是全局的!
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight()
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
# 运行脚本
read()
英文:
Declare state
, index
and tape
as local variables at the top of your functions
Every function is a new namespace. This means that even though the variable state
was defined in the outer scope, it is not defined in the function. To fix this we can use python's global
keyword, to ensure that your variables are defined within the function.
Quick explanation of global
keyword:
Surprisingly, this code contains an error:
foo = 1
def do_something():
foo = 2 # Uh, oh... foo is undefined
Let's fix it:
foo = 1
def do_something():
global foo # make sure foo is global
foo = 2 # This works fine!
So, back to your code: We need to put global key words at the top of all your functions as in:
#Turing Machine In Python
#by adrian wheeler
#the script
index = 5
state = 0
tape = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
def MoveRight():
global index # Make sure our vars are global!
index += 1
def MoveLeft():
global index # Make sure our vars are global!
index -= 1
def read():
global state, index, tape # Make sure our vars are global!
if state == 0:
if tape[index] == 0:
tape.insert(index, "1")
state = 2
MoveRight()
read()
if state == 2:
if tape[index] == 0:
tape.insert(index, "1")
state = 3
MoveRight
read()
if state == 3:
if tape[index] == 0:
tape.insert(index, "1")
state = 4
MoveLeft()
read()
if state == 4:
if tape[index] == 1:
tape.insert(index, "0")
state = 4
MoveLeft
read()
if state == 4:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 0:
tape.insert(index, "0")
state = 5
MoveRight()
read()
if state == 5:
if tape[index] == 1:
tape.insert(index, "1")
state = 0
MoveRight()
read()
#running the script
read()
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论