NameError:未定义名称“A”

时间:2011-09-05 17:51:34

标签: python

问题: 编写一个程序,将棋盘上的位置作为列col和行值行,并检查该位置是否有效。请记住,棋盘中的列是从A到H(包括)的字母,行是1到8之间的数字(含)。 A3或E7是有效输入,但a1或L5不是。如果两个坐标都是有效的,例如E2,程序会打印出“棋子移动到E2”,否则会打印“位置无效”。

我的回答:

a=raw_input("you move to:")
col = [A, B, C, D, E, F, G]
row = [1, 2, 3, 4, 5, 6, 7]
if (a in col) and (a in row):
 print 'The piece is moved to '%s%d   %input
else:
 print 'The position is not valid.'

错误(插入D5之后的值)

Traceback (most recent call last):
  File "<web session>", line 2, in <module>
NameError: name 'A' is not defined

REQUEST:

你能指导我如何解决我的程序吗?

背景:

这项任务的目的是让我回答以下问题:

到目前为止,您的程序使用了两个单独的输入:列和行值。你可以修改你以前的程序(象棋问题,版本3)接受国际象棋棋盘上的位置作为单个输入。换句话说,假设存在可变位置,其存储诸如B5的棋盘的列和行值。当输入中的两个坐标都有效时,例如c4,程序打印消息该块移动到c4 ..如果第一个坐标超出范围,则打印第一个坐标不在ah或AH范围内! ,如果第二个坐标超出范围,则打印第二个坐标不在1到8范围内!

CLOSE:

感谢您的协助。

5 个答案:

答案 0 :(得分:3)

问题在于:

col = [A, B, C, D, E, F, G]

您的列表应该包含字符串,因此您需要引用每个字母,就像引用print语句中的字符串一样。不带引号,它们被视为标识符(用于变量,类,函数等),这就是你最终得出错误的方法。

此外,如Voooza's answer中所述,您需要对输入字符串进行切片/索引(a[0]获取第一个字母,而a[1]获取第二个字符,即数字)。通过执行rowa[1]int(a[1])中的所有数字引用到int中,以便进行比较。

最后,由于您的原始输入变量名为a,因此您需要使用print而非a格式化第一个input语句。

答案 1 :(得分:2)

col = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

否则它会查找变量A,B,C ......但找不到它们

答案 2 :(得分:0)

你需要引用'A','B'等中的每一个,以便将它们解析为字符串,而不是标识符。

答案 3 :(得分:0)

你需要将字符放在引号

col = ['A', 'B', 'C', 'D', 'E', 'F', 'G']

你需要使用切片

if (a[0] in col) and (a[1] in row):
 print 'The piece is moved to '%s%d   %input
else:
 print 'The position is not valid.'

最后你需要将输入转换为行中的数字或qoute数字

答案 4 :(得分:-1)

完整程序必须如

col = ['A', 'B', 'C', 'D', 'E', 'F', 'G']
row = [1, 2, 3, 4, 5, 6, 7]
pos=raw_input("you move to:")
try:
    x=pos[0] # A1 > A
    y=pos[1] # A1 > 1
    if (x in col) and (int(y) in row):
       print 'The piece is moved to %s' % pos
except:
   print 'The position is not valid.'