我在python中有一个函数,我只想在第一次调用这个函数时声明2个变量然后更改它们的值,如下所示:
def function():
x=0
z=2
if(x>z):
other_function()
else:
x+=1
通过这种方式,每当我调用function()
时,x变为0,z变为2.
我试图让它们在函数()之外变为全局,但它给了我错误:
UnboundLocalError:局部变量' x'在分配前引用
如何在第一次调用函数()时声明值?
答案 0 :(得分:2)
我不同意其他答案,只是试图直接回答你的问题。
你有 state (变量)和使用该状态的函数/函数的组合。这就是类的用途。
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
用作:
instance = myclass()
instance.myfunction()
instance.myfunction() # Etc
答案 1 :(得分:1)
您可以在Python中使用词法范围和全局:
x = 0
z = 2
def foo():
global x
if (x > z):
bar()
else:
x += 1
foo()
答案 2 :(得分:1)
欢迎来到closure
你应该这样写:
def f(x):
def g(y):
return x + y
return g
def h(x):
return lambda y: x + y
a = f(1)
b = h(1)
f(1)(5)
h(1)(5)
答案 3 :(得分:0)
如果你想从函数之外的某个地方获取x和z,那么它们必须作为参数传递给function
。例如:
def function(a,b):
if(a>b):
other_function()
else:
a+=1
return a, b
然后可以用
调用x, z = function(0,2)
答案 4 :(得分:0)
您可以使用默认函数参数
<强>即。)强>
def function(x = None, z = None):
if x is None:
x=0
if z is None:
z=2
如果您传递x or z the passed value is used else it is initialized to the value given in the function
答案 5 :(得分:0)
您可以谨慎滥用强大的可变默认值 。
def func(vals = {'x': 0, 'z': 2}):
print vals['x']
vals['x'] += 1
func()
>> 0
func()
>> 1
func()
>> 2
虽然我认为正确这样做的方法是使用装饰器:
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
一个更可重用的版本,其中x
和z
的起始值可以传递给装饰器:
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
答案 6 :(得分:0)
我会将它们放在字典中以提高可读性:
_VALS = {'x': 0, 'z': 2}
def function():
if _VALS['x'] > _VALS['z']:
other_function()
else:
_VALS['x'] += 1