我有一组变量依赖于另一个变量集合的值,我需要能够只用一个命令刷新前一个集合。我曾计划使用def(函数)来做这件事,但我在创建或更改函数内部的变量方面遇到了问题。这是我失败的代码:
variable1 = 5
variable2 = 5
variable3 = 10
def refresh():
variable4 = variable1 + variable2 + variable3
variable5 = variable3 - variable2 / variable1
refresh()
获得该功能的好方法是什么?
答案 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
另一种替代方法是将variable4
和variable5
替换为您在需要值时调用的函数。
如果一遍又一遍地计算它们确实存在性能问题,你可以使用某种形式的缓存来清除缓存 - 但是在这种情况下,在类中创建它们也是一个好主意。 / 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标记我,以便我知道回来!)
快乐的编码!