【问题标题】:Python: Increment / Decrement a global variable (or alternative method)Python:增加/减少全局变量(或替代方法)
【发布时间】:2013-10-22 04:02:10
【问题描述】:

这是我编写的模块中的两个函数:

def start():
    numberstr = raw_input("Enter a number to start ")
    global number
    number = int(numberstr)
    readline("data.csv", number)
    control()

def control():
    operation = raw_input("Repeat (R), Next (N), or Previous (P) ")
    if operation == "R":
        readline("data.csv", number)
        control()
    elif operation == "N":
        readline("data.csv", number + 1)
        control()
    elif operation == "P":
        readline("data.csv", number - 1)
        control()
    else:
        print "Incorrect command"
        control()

start()

我希望它提示输入初始数字,运行 readline 函数,然后运行 ​​control 函数。控制函数应该以该初始数字开始,然后能够在每次运行 readline 函数后根据提示进行递增/递减。

实际行为是它会增加一次然后保持不变。以前的控制是不可预测的;我不确定那里发生了什么。

我已经阅读以避免全局变量,我觉得这可能是问题的根源。我不确定如何实施替代方案。

感谢您的帮助!

【问题讨论】:

  • 很确定您只需要在两个函数之外以及每个函数内部声明global number
  • 实际上,您可能不必在两者之外声明它,只需在两者之内。
  • 您无需使用您选择的答案来编辑您的问题。
  • Inbar,我知道,但我在这里这样做是因为我必须对其进行一些更改才能使其正常工作并为其他人的利益而发布。你觉得它增加了不必要的混乱吗?
  • 绝对放心。从本网站上的其他问题/答案中排队,以了解我们如何在这里做事。您还可以从一些 Python 教程中受益,将我提出的解决方案修改到无法识别的程度尤其残酷。

标签: python global-variables increment decrement


【解决方案1】:

没试过,为什么不把它作为参数传递呢?

像这样:

def start():
    numberstr = raw_input("Enter a number to start ")
    number = int(numberstr)
    readline("data.csv", number)
    control(number)

def control(number):
    operation = raw_input("Repeat (R), Next (N), or Previous (P) ")
    if operation == "R":
        readline("data.csv", number)
        control(number)
    elif operation == "N":
        number +=1
        readline("data.csv", number)
        control(number)
    elif operation == "P":
        number -=1
        readline("data.csv", number)
        control(number)
    else:
        print "Incorrect command"
        control(number)
start()

希望这会有所帮助!

【讨论】:

  • 仍然比使用全局更“混乱”。
  • 谢谢,很简单!我将发布我的最终工作代码。
  • 这里不需要递归,但它是使用 while 循环的另一种选择。还应该添加一个“Q”选项来退出,否则它将永远运行。您还可以将 raw_input 更改为 input(),它采用 int 值并消除对第 3 行的需要
【解决方案2】:

试试这个:

def operate():
    number = input("Enter a number to start: ")
    while True:
        readline("data.csv", number)
        op = raw_input("Repeat (R), Next (N), Previous (P), or Quit (Q) ")
        if op == "R": pass
        elif op == "N": number += 1
        elif op == "P": number -= 1
        elif op == "Q": break
        else: raise Exception("Incorrect command")

operate()

这使它保持本地化,不需要全局变量,并将其放入一个循环中,这应该会减少开销。我还添加了一个Quit 选项。

【讨论】:

  • numbers += 1 与写 numbers = numbers + 1 相同。您应该接受您使用的答案。
  • 感谢您的更新。这个版本的功能非常优雅。我在 raw_input 之后添加了 .upper() ,因此它也可以使用小写字母。现在我将致力于异常处理。
猜你喜欢
  • 1970-01-01
  • 2017-01-18
  • 2017-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
相关资源
最近更新 更多