Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用一个命令刷新变量列表_Python_Variables_Refresh - Fatal编程技术网

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

Python 用一个命令刷新变量列表,python,variables,refresh,Python,Variables,Refresh,我有一个变量集合,它依赖于另一个变量集合的值,我需要能够用一个命令刷新前一个集合。我曾计划使用def(函数)来实现这一点,但在创建或更改函数内部的变量时遇到了问题。以下是我的失败代码: variable1 = 5 variable2 = 5 variable3 = 10 def refresh(): variable4 = variable1 + variable2 + variable3 variable5 = variable3 - variable2 / variable

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

variable1 = 5
variable2 = 5
variable3 = 10

def refresh():
    variable4 = variable1 + variable2 + variable3
    variable5 = variable3 - variable2 / variable1
refresh()
获得该功能的好方法是什么

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
def refresh(self):
    self.variable4 = self.variable1 + self.variable2 + self.variable3
    self.variable5 = self.variable3 - self.variable2 / self.variable1
或者可能将所有这些自变量封装在一个
类中
,这样您就可以使用如下方法将它们带到一起:

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

另一种选择是将
variable4
variable5
替换为只需在需要值时调用的函数

如果反复计算它们确实存在性能问题,您可以使用某种形式的缓存和显式方式来清除缓存,但在这种情况下,将它们作为类中的方法也是一个好主意

或者,也许更好的是,将它们设置为类的
@property
s,这样它们看起来像属性,但工作起来像函数


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

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
或者,如果您希望通过每次重新计算值来摆脱显式的
刷新
调用:

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

将刷新所需的上述变量作为参数引入函数

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
然后通过代码的其余部分,您可以看到它执行相同的工作<计算代码>变量4和
变量5
,然后在列表中返回它们。最后,你是说:

variable4 = var4_ #20
variable5 = var5_ #9
最后的
print
命令仅验证了这一点,我提供的脚本提供了以下代码:

20
9
这回答了你的问题吗?如果没有,请随时发表评论并询问更多信息(请确保用@jwarner112标记我,以便我知道该回来了!)


快乐编码

variable4
variable5
不应该是变量,它们应该是函数。@roippi那么函数的返回值应该存储在哪里?非常感谢:)问题是,变量1-3实际上更像40个变量,而4-5实际上是9个总变量。这是一个相当大的参数量。@user3108546:那么您几乎肯定不需要40个单独的变量,而是一个列表、dict或类实例。见和。(再加上需要一个
refresh
函数,一个类相对于其他选项的参数似乎非常强大。)@user3108546:你需要一个例子来开始,还是只需要一个基本提示就可以了?是的,举个例子,我会非常感激,因为我以前从未真正使用过类。这肯定回答了我的问题,但如果我使用更大的范围(代替变量1-3,我将有40个变量,代替变量4和5,我将有9个变量(每9个变量都有一组不同的前40个作为参数))在这种情况下,我会使用
元组
列表
。与
def refresh(var1,var2,var3)
不同,您需要
def refresh(hereisalist)
def refresh(hereisatuple*)
,其中列表只是一个包含40个变量的列表,或者元组只是(var1,var2,var3,…,var40),您可以知道从
[0]
[39]
用于内部。你还可以让函数返回一个列表或元组,然后在外部赋值,就像在内部赋值一样。使用列表是一个有趣的想法,我应该早点想到这一点。我也会使用9个列表(函数中的9个变量各1个),所以它是可行的,但我从来不会将整个40个值放入一个列表或元组中。我想,要跟踪这件事太麻烦了。感谢您的帮助:)@user3108546:A
dict
是一种很好的方法,它将所有值组合成一个变量,而不是像
列表那样的40个变量,但它让每个值都有一个值得记忆的名称,而不是像使用单独的变量那样仅是#13。(一个
class
namedtuple
是另外两种可以两全其美的方法,在一个
dict
上有不同的优点和缺点;这三种方法都值得学习。)