记住函数调用后的数组值

时间:2014-12-04 23:34:59

标签: python arrays function

如果我写这个:

c = []

def cf(n):
    c = range (5)
    print c
    if any((i>3) for i in c) is True:
        print 'hello'

cf(1)

print c

然后我得到:

[1, 2, 3, 4]
hello
[]

我是编程新手,所以请简单解释一下,但是如何阻止Python忘记函数结束后的c?我认为我可以通过在函数前定义c来修复它,但显然c与为函数循环创建的c = range (5) def cf(n) 不同。

在我的例子中,我显然可以写:

b = [blah]
c = []
def cf(n):
    c = [transformation of b]
    if (blah) is True:
       'loop' cf
    else:
cf(1)
g = [transformation of c that produces errors if c is empty or if c = b]

但是我想写的程序更像是这样:

c

所以我无法在函数外定义{{1}}。

5 个答案:

答案 0 :(得分:4)

在python中,您可以读取函数中的全局变量,但默认情况下您无法分配它们。原因是每当python找到c =时,它都会创建一个局部变量。因此,要分配给全局变量,您需要明确指定要分配给全局变量。

所以这会起作用,例如:

c = [1,2,3]

def cf(): 
    print(c) # it prints [1,2,3], it reads global c

但是,这并不像您期望的那样:

c = [1,2,3]

def cf(): 
    c = 1 # c is local here.
    print(c) # it prints 1


cf()
print(c) # it prints [1,2,3], as its value not changed inside cf()

所以要使c相同,你需要:

c = [1,2,3]

def cf(): 
    global c
    c = 1  # c is global here. it overwrites [1,2,3]
    print(c) # prints 1


cf()
print(c) # prints 1. c value was changed inside cf()

答案 1 :(得分:2)

您也可以在声明后将数组c传递给函数。由于数组是函数参数,只要我们不使用c语句,就会修改传入的=。这可以这样实现:

def cf(n, c):
  c.extend(range(5))
  print c
  if any((i>3) for i in c) is True:
    print 'hello'

if __name__ == '__main__':
  c = []
  cf(1, c)
  print c

有关此问题的解释,请参阅this

这比将全局变量引入代码更好(这通常被认为是不好的做法)。 ref

答案 2 :(得分:2)

总结一下这些答案,您有3个基本选项:

  1. 在函数顶部将变量声明为全局
  2. 在函数末尾返回变量的本地实例
  3. 将变量作为参数传递给函数

答案 3 :(得分:1)

试试这个

c = []

def cf(n):
  global c
  c = range (5)
  print c
  if any((i>3) for i in c) is True:
    print 'hello'

cf(1)

print c

答案 4 :(得分:1)

如果您希望您的函数修改c,请将其设为明确,即您的函数应返回c的新值。这样可以避免不必要的副作用:

def cf(n, b):
    """Given b loops n times ...

    Returns
    ------
    c: The modified value
    """
    c = [transformation of b]
    ...
    return c  # <<<<------- This

c = cf(1)