Python declare variables only the first time I call a function
本问题已经有最佳答案,请猛点这里访问。
我在python中有一个函数,我只想在第一次调用这个函数时声明两个变量,然后更改它们的值,如下所示:
1 2 3 4 5 6 7 | def function(): x=0 z=2 if(x>z): other_function() else: x+=1 |
这样,每次我调用
我试图使它们在函数()之外成为全局的,但它给了我错误:
UnboundLocalError: local variable 'x' referenced before assignment
我如何在第一次调用函数()时声明这些值?
我不同意其他的答案,那只是试着直接回答你的问题。
状态(变量)与使用该状态的函数/函数的组合。这就是课堂的目的。
1 2 3 4 5 6 7 8 9 10 11 | class myclass: def __init__(self): self.x = 0 self.z = 2 def myfunction(self): if self.x > self.z: other_function() # Possibly self.other_function() # if that one also uses x or z else: self.x += 1 |
用作:
1 2 3 | instance = myclass() instance.myfunction() instance.myfunction() # Etc |
欢迎结束
你应该这样写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <wyn> def f(x): def g(y): return x + y return g </p> <p> def h(x): return lambda y: x + y </p> <p> a = f(1) b = h(1) f(1)(5) h(1)(5) |
代码>
您可以在python中使用词汇范围和全局:
1 2 3 4 5 6 7 8 9 | x = 0 z = 2 def foo(): global x if (x > z): bar() else: x += 1 foo() |
为了提高可读性,我会把它们放在字典里:
1 2 3 4 5 6 | _VALS = {'x': 0, 'z': 2} def function(): if _VALS['x'] > _VALS['z']: other_function() else: _VALS['x'] += 1 |
您可以谨慎地滥用强大的可变默认值。
1 2 3 4 5 6 7 8 9 10 | def func(vals = {'x': 0, 'z': 2}): print vals['x'] vals['x'] += 1 func() >> 0 func() >> 1 func() >> 2 |
尽管我想正确的方法是使用装饰:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | def default_value_decorator(func): def inner(*args, **kwargs): returned_val = func(*args, **kwargs) inner.x += 1 return returned_val inner.x = 0 inner.z = 2 return inner @default_value_decorator def func(): print func.x func() >> 0 func() >> 1 |
以及更可重用的版本,其中可以将
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | def default_value_decorator(x, z): def a(func): def inner(*args, **kwargs): returned_val = func(*args, **kwargs) inner.x += 1 return returned_val inner.x = x inner.z = z return inner return a @default_value_decorator(0, 2) def func(): print func.x func() >> 0 func() >> 1 |
可以使用默认函数参数
即)
1 2 3 4 5 | def function(x = None, z = None): if x is None: x=0 if z is None: z=2 |
如果你通过了EDOCX1[1]的值
如果您想从函数之外的某个地方获取x和z,那么必须将它们作为参数传递给
1 2 3 4 5 6 7 | def function(a,b): if(a>b): other_function() else: a+=1 return a, b |
然后可以用
1 | x, z = function(0,2) |