如何用函数改变全局变量?

时间:2017-03-30 17:56:18

标签: python-3.x

我正在努力创造一个"选择你自己的冒险" Python中的风格游戏,其中用户插入与动作相对应的各种数字,这些动作将决定下一个故事的哪个部分。当用户插入一个无效的选项时,我没有试图使函数简化无穷无尽的if / else语句,但我遇到了困难。我有一个"步骤"变化并导致不同情况的变量,我的函数成功更改了步变量,但if / else语句不会触发。任何帮助将不胜感激!

step = 7

def stepchange():
  global step
  b = step
  while step == b:
    a = input()
    if a == 1:
      global step
      step = b + .1
    if a == 2:
      global step 
      step = b + .2
    if a ==3:
      global step
      step = b + .3

global step
if step == 7.1:
   print("Step 7.1")

global step
if step == 7.2:
    print("Step 7.2")

global step
if step ==7.3:
    print("Step 7.3")

2 个答案:

答案 0 :(得分:0)

您无法调用该函数,因此不会发生步骤更改。通话后,您可能仍会遇到以后的比较问题。 float实际上是一个二进制小数,它以十进制的形式估算,但不完全相等。因此,例如,7.1确实是7.099999999999999644728632119949907064437866210937500000。由于您对这些数字进行了一些数学运算,您可能会发现舍入误差会导致它们略有不同,因此比较失败。

您可以删除额外不需要的global语句并使用decimal模块:

from decimal import Decimal

step = Decimal('7')

def stepchange():
  global step
  b = step
  while step == b:
    a = Decimal(input())
    if a == 1:
      step = b + Decimal('.1')
    if a == 2: 
      step = b + Decimal('.2')
    if a ==3:
      step = b + Decimal('.3')

stepchange()

if step == Decimal('7.1'):
   print("Step 7.1")
elif step == Decimal('7.2'):
    print("Step 7.2")
if step == Decimal('7.3'):
    print("Step 7.3")

我不确切知道应该采取什么步骤,但如果您正在考虑步骤加子步骤,列表可能是更好的选择:

step = [7, 0]


def stepchange():
  global step
  while True:
    a = int(input())
    if a in (1, 2, 3):
      step[1] = a
      break

stepchange()

if step == [7, 1]:
   print("Step 7.1")
elif step == [7, 2]:
    print("Step 7.2")
if step == [7, 3]:
    print("Step 7.3")

答案 1 :(得分:0)

正如评论中所提到的,float比较是棘手的。由于您正在输入文本,因此您可以继续使用文本。

step = "7"

def stepchange():
    global step
    b = step
    a = input()
    if a == "1":
        step = b + ".1"
    if a == "2":
        step = b + ".2"
    if a =="3":
        step = b + ".3"

if step == "7.1":
    print("Step 7.1")
elif step == "7.2":
    print("Step 7.2")
elif step == "7.3":
    print("Step 7.3")