【问题标题】:Remember Array value after Function call函数调用后记住数组值
【发布时间】:2015-02-03 01:14:49
【问题描述】:

如果我这样写:

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

【问题讨论】:

  • global c 放在函数顶部,它将使用文件顶层定义的版本,而不是在函数内部创建新变量。
  • global ccf 中使用它
  • 我将添加强制不要使用全局,几乎总是有更好的方法。
  • @Patrik333 请注意,尽管global c 是一种有效 解决方案,但它的效果很差。使用return
  • 请注意,您的 if 语句中不需要 is True。对于无论如何都返回布尔值的测试(如 any() 和 all()),它是纯噪声。对于确实有所作为的情况,if blah: 几乎肯定是您的意思,而不是 if blah is True:

标签: python arrays function


【解决方案1】:

您也可以在声明后将数组 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】:

    如果您希望您的函数修改 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)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案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()
        

        【讨论】:

        • 太棒了,这正是我想要的!我会点击投票,但我需要 15 个代表......我会点击“已回答”,但显然我必须等待 2 分钟。但是,是的,这很棒,谢谢。
        • @Patrik333 谢谢。很高兴我能为你澄清这个问题。
        • 我现在实际上有另一个相关问题 - 我想我应该发一个新帖子?
        • @Patrik333 是的,你可以。
        【解决方案5】:

        试试这个

        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
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-07
          • 1970-01-01
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2011-07-12
          • 2016-08-26
          • 2018-04-09
          相关资源
          最近更新 更多