f строка не обновляется внутри списка - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь создать игру Yahtzee в python, но у меня возникают проблемы с занесением очков в составленную мной таблицу. Таблица представляет собой список, каждый элемент которого соответствует одной строке. Каждый элемент (то есть каждая строка) представляет собой f-строку, которая извлекает значение из словаря в фигурных скобках.

Позже в коде я обновляю значение, которое вызывается в строке, и печатаю строку. По какой-то причине печатается старое значение из словаря.

from random import randrange

def roll(saved):
    global roll
    roll = []
    for i in range(5 - len(saved)):
        roll.append(str(randrange(1,7)))
    global roll_og
    roll_og = roll
    roll.sort()
    print("Avaliable dice : " + ",".join(roll))

def avaliable_points():
#numbers
    global roll_og
    for i in range(1,7):
        if roll_og.count(str(i)) > 0:
            points[str(i)] = roll_og.count(str(i)) * i


def print_table(table):
    for i in table:
        print(i)


saved = []

points = {
    "1" : "",
    "2" : "",
    "3" : "",
    "4" : "",
    "5" : "",
    "6" : ""
}

avaliable_grid = [
     " _____________________________          _____________________________",
     "|           |Player 1|Player 2|        |           |Player 1|Player 2|",
     "|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Ones       |{points[str(1)]}|        |        |3 of a Kind|        |        |",
    f"|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Twos       |{points[str(2)]}|        |        |4 of a Kind|        |        |",
    f"|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Threes     |{points[str(3)]}|        |        |Full House |        |        |",
    f"|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Fours      |{points[str(4)]}|        |        |S. Straight|        |        |",
    f"|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Fives      |{points[str(5)]}|        |        |L. Straight|        |        |",
    f"|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Sixes      |{points[str(6)]}|        |        |Chance     |        |        |",
    "|-----------|--------|--------|        |-----------|--------|--------|",
    "|#############################|        |YAHTZEE    |        |        |",
    "|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Sum        |        |        |        |#############################|",
    "|-----------|--------|--------|        |-----------|--------|--------|",
    f"|Bonus      |        |        |        |TOTAL SCORE|        |        |",
    " -----------------------------          ----------------------------- ",
    ]


roll(saved)
avaliable_points()
print(points)
print_table(avaliable_grid)    

Таблица, которая меня интересует, - это список available_grid, а словарь - это словарь points. Все остальные функции в коде - это те, которые определяют, сколько точек go в каждом слоте в таблице.

Avaliable dice : 1,2,2,4,6
{'1': 1, '2': 4, '3': '', '4': 4, '5': '', '6': 6}
 _____________________________          _____________________________
|           |Player 1|Player 2|        |           |Player 1|Player 2|
|-----------|--------|--------|        |-----------|--------|--------|
|Ones       ||        |        |3 of a Kind|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Twos       ||        |        |4 of a Kind|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Threes     ||        |        |Full House |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Fours      ||        |        |S. Straight|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Fives      ||        |        |L. Straight|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Sixes      ||        |        |Chance     |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|#############################|        |YAHTZEE    |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Sum        |        |        |        |#############################|
|-----------|--------|--------|        |-----------|--------|--------|
|Bonus      |        |        |        |TOTAL SCORE|        |        |
 -----------------------------          ----------------------------- 

Я распечатал словарь после того, как изменил его, чтобы проверить, действительно ли он был изменен.

1 Ответ

1 голос
/ 26 мая 2020

Проблема в том, что вы ожидаете, что строки f будут обновляться при изменении словаря points, но строки f создаются неизменяемо при интерпретации. Взгляните на этот пример:

>>> x = 10
>>> x_string = f"x is {x}"
>>> x_string
'x is 10'

>>> x = 20        # Change the value of x.
>>> x_string
'x is 10'

Итак, один из способов решить вашу проблему - определить avaliable_grid в print_table().

def print_table(points):
    available_grid = [ #...
                       #...
        ]
    for i in available_grid:
        print(i)

Я также рекомендую передать points, поэтому чтобы вы не путались с глобальными переменными.

Кстати, поскольку вы используете available_grid только как способ отслеживания строки, вы можете получить тот же результат с блочной строкой.

available_grid = f"""
 _____________________________          _____________________________
|           |Player 1|Player 2|        |           |Player 1|Player 2|
|-----------|--------|--------|        |-----------|--------|--------|
|Ones       |{points[str(1)]}|        |        |3 of a Kind|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Twos       |{points[str(2)]}|        |        |4 of a Kind|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Threes     |{points[str(3)]}|        |        |Full House |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Fours      |{points[str(4)]}|        |        |S. Straight|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Fives      |{points[str(5)]}|        |        |L. Straight|        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Sixes      |{points[str(6)]}|        |        |Chance     |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|#############################|        |YAHTZEE    |        |        |
|-----------|--------|--------|        |-----------|--------|--------|
|Sum        |        |        |        |#############################|
|-----------|--------|--------|        |-----------|--------|--------|
|Bonus      |        |        |        |TOTAL SCORE|        |        |
 -----------------------------          -----------------------------
"""
...