如果我写这个:
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}}。
答案 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个基本选项:
答案 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)