使用一个命令刷新变量列表

时间:2013-12-16 19:17:33

标签: python variables refresh

我有一组变量依赖于另一个变量集合的值,我需要能够只用一个命令刷新前一个集合。我曾计划使用def(函数)来做这件事,但我在创建或更改函数内部的变量方面遇到了问题。这是我失败的代码:

variable1 = 5
variable2 = 5
variable3 = 10

def refresh():
    variable4 = variable1 + variable2 + variable3
    variable5 = variable3 - variable2 / variable1
refresh()

获得该功能的好方法是什么?

2 个答案:

答案 0 :(得分:3)

  

python不允许我使用函数内部的变量......

确实如此。问题是Python假设当你尝试分配变量时,你试图创建本地变量,除非你另外告诉它。这样做的方法是使用global语句:

def refresh():
    global variable4, variable5
    variable4 = variable1 + variable2 + variable3
    variable5 = variable3 - variable2 / variable1

默认情况下Python假定为局部的原因是通常全局变量是个坏主意。如果您只是为了方便解释提示而这样做,那么它可能是合理的。但如果没有,你应该采用参数并返回值,如下所示:

def refresh(variable1, variable2, variable3):
    variable4 = variable1 + variable2 + variable3
    variable5 = variable3 - variable2 / variable1
    return variable4, variable5

或者可能将所有这些自变量包含在class中,这样你就可以用这样的方法将它们全部包含在一起:

def refresh(self):
    self.variable4 = self.variable1 + self.variable2 + self.variable3
    self.variable5 = self.variable3 - self.variable2 / self.variable1

另一种替代方法是将variable4variable5替换为您在需要值时调用的函数。

如果一遍又一遍地计算它们确实存在性能问题,你可以使用某种形式的缓存来清除缓存 - 但是在这种情况下,在类中创建它们也是一个好主意。 / p>

或者甚至更好,让他们成为一个类的@property,让他们看起来像属性,但工作就像函数一样。


以下是使用类而不是一堆单独变量的示例:

class BunchOfStuff(object):
    def __init__(self):
        self.variable1 = 5
        self.variable2 = 10
        self.variable3 = 15
        self.refresh()
    def refresh():
        self.variable4 = self.variable1 + self.variable2 + self.variable3
        self.variable5 = self.variable3 - self.variable2 / self.variable1

stuff = BunchOfStuff()
print(stuff.variable4) # prints 30
stuff.variable1 = 10
print(stuff.variable4) # still prints 30
stuff.refresh()
print(stuff.variable4) # now prints 35

或者,如果您想通过每次重新计算值来摆脱明确的refresh调用:

class BunchOfStuff(object):
    def __init__(self):
        self.variable1 = 5
        self.variable2 = 10
        self.variable3 = 15
    def variable4(self):
        return self.variable1 + self.variable2 + self.variable3

stuff = BunchOfStuff()
print(stuff.variable4()) # prints 30 -- note that it's a method, so we call it
stuff.variable1 = 10
print(stuff.variable4()) # prints 35

如果您希望variable4看起来像常规属性,但就像方法一样,请执行以下操作:

class BunchOfStuff(object):
    def __init__(self):
        self.variable1 = 5
        self.variable2 = 10
        self.variable3 = 15
    @property
    def variable4(self):
        return self.variable1 + self.variable2 + self.variable3

stuff = BunchOfStuff()
print(stuff.variable4) # prints 30 -- no need to call it, it acts like a variable
stuff.variable1 = 10
print(stuff.variable4) # prints 35

答案 1 :(得分:0)

引入所需的变量,以便将参数刷新到函数中。

variable1 = 5
variable2 = 5
variable3 = 10

def refresh(var1_,var2_,var3_):
    var4_ = var1_ + var2_ + var3_
    var5_ = var3_ - var2_ / var1_
    return var4_, var5_

variable4, variable5 = refresh(variable1,variable2,variable3)

print variable4
print variable5

您的代码中发生了什么

您正在像以前一样定义变量1,2和3,只是现在您将它们直接传递给函数。在第一行def refresh(var1_,var2_,var3),声明基本上是这样说:

var1_ = variable1
var2_ = variable2
var3_ = variable3

然后通过其余代码,您可以看到它执行相同的工作。计算var4_var5_,然后在列表中显示returned。最后,你说的是:

variable4 = var4_ #20
variable5 = var5_ #9

最后的print命令只是验证了这一点,我提供的脚本为您提供了代码:

20
9

这是否回答了你的问题?如果没有,请随时评论并询问更多(请务必用@ jwarner112标记我,以便我知道回来!)

快乐的编码!