Python仅在我第一次调用函数时声明变量

时间:2015-12-14 10:59:57

标签: python

我在python中有一个函数,我只想在第一次调用这个函数时声明2个变量然后更改它们的值,如下所示:

def function():
  x=0
  z=2
  if(x>z):
    other_function()
  else:
    x+=1

通过这种方式,每当我调用function()时,x变为0,z变为2.

我试图让它们在函数()之外变为全局,但它给了我错误:

  

UnboundLocalError:局部变量' x'在分配前引用

如何在第一次调用函数()时声明值?

7 个答案:

答案 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

一个更可重用的版本,其中xz的起始值可以传递给装饰器:

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