2016-12-28 3 views
0

Я являюсь абсолютным новичком, который в настоящее время работает над игрой Tic Tac Toe, и в приведенном ниже примере я зациклился на том, как преобразовать строку (например, «row1 [0]») в индекс списка (например, row1 [0]). В принципе, я не уверен, почему eval (aa) = a не работает, но, например, row1 [0] = a работает (и да, я знаю, что eval() обычно недооценивается, но не смог найти любые альтернативы, как словари, exec и компиляция, все сбой).Можно ли преобразовать строку в индекс списка в Python (2.7)?

Также обратите внимание, что это не полный код, а только одна из моих попыток выяснить выше. Понравился бы ваш вход на этот конкретный шаг, я пока не смог найти ответ. Благодарю.

row1 = [_,_,_] 
row2 = [_,_,_] 
row3 = [_,_,_] 
a = raw_input("Player 1, choose your marker - X or O: ") 
aa = raw_input("Player 1, choose box (row#[box # - 1]): ") 
#Attempt at assigning "X" or "O" to a row index. 
eval(aa) = a 
print row1 
print row2 
print row3 

ответ

0

eval('row1[0]') = 'X' не работает по той же причине, что 'a' = 'b' не будет работать.

eval('row1[0]') возвращает значение списка row1 с индексом 0, а не ссылку на него.

Если row1 является ['', '', ''] того eval(row1[0]) вернет пустую строку (''), и вы не можете присвоить строку 'X' в пустую строку.

Если вы хотите использовать eval, тогда пользователю необходимо будет ввести имя списка и индекс отдельно.

row1 = ['', '', ''] 
eval('row1')[0] = 'X' 
print row1 
# ['X', '', ''] 


Я понимаю, что вы новичок, но мое предложение использовать класс, так что вы сможете использовать getattr. getattr - это встроенная функция в Python, которая принимает объект и строку и возвращает атрибут объекта с этим именем.

class Board(object): 
    def __init__(self): 
      self.row1 = ['', '', ''] 
      self.row2 = ['', '', ''] 
      self.row3 = ['' ,'', ''] 

board = Board() 
shape = raw_input("Player 1, choose your marker - X or O: ") 
row_and_col = raw_input("Player 1, choose box (row#,col#): ") # user will input 1,0 
                   # for example 

row_number, col_number = row_and_col.split(',') # split divides the string it is called 
               # upon with the character it gets as 
               # the argument. In this case 
               # 'row_and_col' is '1,0' so after this 
               # line row_number is '1' and col_number 
               # is '0' 

relevant_row = getattr(board, 'row' + row_number) 
# now relevant_row actually holds the reference to the list, 
# not its value as eval would have returned 

relevant_row[int(col_number)] = shape 
+0

Спасибо DeepSpace, я еще не сделал это для объектно-ориентированного программирования; это определенно имеет гораздо больше смысла, чем eval(). –

Смежные вопросы