Python函数参数可以用作函数内变量吗?

时间:2019-10-17 03:37:30

标签: python tkinter

我正在构建一个允许用户跟踪篮球得分的应用程序。例如,如果一支球队罚球,他们按得分队标题下方的“罚球”按钮,将一个分数加到显示的分数上。我正在使用Python 3.x,想知道我是否可以编写将被指定为home或走远得分变量的函数参数,然后更新指定的得分。目前,对于每个团队的每种得分类型,我都有单独的功能,这意味着我实质上具有重复的代码,减去了“主场”和“客场”之间的差异。由于与其他软件接口的要求,本国得分和客场得分都保存为全局得分。我是否只能使用6个函数,还是可以编写3个函数并仅指定调用该函数时要更新的全局变量?随附示例非工作代码

global away_score
away_score = 0

global home_score
home_score = 0

def plus_one(inc_score, inc_frame):
    inc_score += 1
    inc_frame.config(text = inc_score) # this is for interfacing with tkinter

3 个答案:

答案 0 :(得分:2)

由于您使用的是tkinter,因此处理此问题的最佳方法可能是利用tkinter变量,在本例中为IntVar

import tkinter as tk

root = tk.Tk()

away_score = tk.IntVar(value=0)
home_score = tk.IntVar(value=0)

def plus_one(inc_score, inc_frame):
    inc_score.set(inc_score.get()+1)
    inc_frame.config(text = inc_score.get())

away_but = tk.Button(root,text=0)
away_but.config(command=lambda: plus_one(away_score,away_but))
away_but.pack()

root.mainloop()

答案 1 :(得分:1)

最好不要使用全局变量,而将代码重构为使用局部变量和字典或对象来存储分数。但是对于您的问题,您可以这样写:

away_score = 0
home_score = 0


def plus_one(inc_frame, add_to_away: bool = False):
    global home_score
    global away_score
    if add_to_away:
        away_score += 1
        inc_score = away_score
    else:
        home_score += 1
        inc_score = home_score
    # inc_frame.config(text = inc_score) # this is for interfacing with tkinter


if __name__ == '__main__':
    plus_one(None, add_to_away=False)
    print(f"home: {home_score}, away: {away_score}")
    plus_one(None, add_to_away=True)
    print(f"home: {home_score}, away: {away_score}")
    plus_one(None, add_to_away=True)
    print(f"home: {home_score}, away: {away_score}")

答案 2 :(得分:0)

虽然您可以 通过名称修改全局变量,但这通常不是您应该做的事情。

但是,如果您确实需要使这些变量成为全局变量(例如,a dictionaryproperties of a class中的条目不是),则您确实不想编写多个更新功能,有解决方案。

根据this answer,您可以修改globals返回的字典,以更新模块名称空间。

some_variable = None

def update(var, value):
    globals()[var] = value

update('some_variable', 'some value')

print(some_variable) # Output: "some value"

但是,如果有可能,您应该避免这样做-有许多更好的代码编写方法,这也为更多令人兴奋的错误留出了空间。

away_score = 10
update('away_scoer', away_score + 1) # npote the typo
print(away_score) # It's still 10, but there was no error in Python.

update('update', print) # now updating prints instead
update('away_score', 11) # Prints "away_score 11"
print(away_score) # still 10

update('print', function_that_melts_your_computer) # probably a bad idea

它还具有一些普通的缺点,例如使您的编辑器不满意以及在某些地方破坏了代码完成。