【问题标题】:Python Global Variables - Not Defined?Python 全局变量 - 未定义?
【发布时间】:2018-09-17 20:14:23
【问题描述】:

我遇到了一个问题,即全局变量在被 2 个不同的函数修改后未被“记住”。变量df 应该是一个数据框,在用户加载正确的文件之前它不会指向任何东西。这类似于我拥有的东西(使用pandastkinter):

global df

class World:

    def __init__(self, master):
        df = None
        ....

    def load(self):
        ....
        df = pd.read_csv(filepath)

    def save(self):
        ....
        df = df.append(...)

save() 总是在load() 之后调用。问题是,当我调用save() 时,我收到“df 未定义”的错误。我以为dfinit() 中得到了初始分配,然后在load() 中得到了“更新”?我在这里做错了什么?

【问题讨论】:

    标签: python pandas debugging global-variables


    【解决方案1】:

    您必须在函数内部而不是外部使用global 关键字。您在函数中定义的所有df 都是本地范围的。这是正确的方法 -

    df = pd.DataFrame() # No need to use global here
    
    def __init__(self, master):
        global df # declare here
        df = None
    ....
    
    def load(self):
        global df # declare here
        ....
        df = pd.read_csv(filepath)
    
    def save(self):
        global df # declare here
        ....
        df = df.append(...)
    

    【讨论】:

      【解决方案2】:

      你必须使用global df里面需要修改全局变量的函数。否则(如果写入),您将在函数内部创建一个同名的局部范围变量,并且您的更改不会反映在全局变量中。

      p = "bla"
      
      def func():
          print("print from func:", p)      # works, readonly access, prints global one
      
      def func1():
          try: 
              print("print from func:", p)  # error, python does not know you mean the global one
              p = 22                        # because function overrides global with local name   
          except UnboundLocalError as unb:
              print(unb)
              
      def func2():
          global p
          p = "blubb"                       # modifies the global p
      
      print(p)
      func()
      func1()
      print(p)
      func2()
      print(p)
      

      输出:

      bla   # global
      
      print from func: bla    # readonly global
      
      local variable 'p' referenced before assignment  # same named local var confusion
      
      bla    # global
      blubb  # changed global
      

      【讨论】:

      • 哦,那是不是每次需要调用的时候都要声明呢?没有办法在课堂上“普遍”记住它吗?
      • @Axioms 如果您希望它可用于类中的所有函数,您可以将其设为类变量。除此之外没什么可做的,只需要在需要的每个函数中编写它
      • @Axioms 我更喜欢根本不使用全局变量——我主要将它们作为函数的参数提供将它们作为类中的成员变量。
      • 那么,如果我在声明一个类(即类变量)后立即设置x = "hello",那么该类的每个函数中的x 会不会是"hello"
      • @Axioms 这将是一个“静态”类变量,它在该类的实例之间共享,一个人改变它 - 所有人都得到了改变。除非你需要创建 20 个不同的世界,否则访问同一个 df 我可能会在 __init__(self, ... ) 中使用 self.df = None,在 load self.df = pd.read_csv(...) 中加载它等等。
      【解决方案3】:

      对于任何使用 python3 来到这里的人 - 尝试使用 nonlocal 而不是 global - python3 中引入的一种新结构,它允许您在本地范围内变异和读取全局变量

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-12
        • 2019-04-08
        • 1970-01-01
        • 2019-10-01
        • 2021-03-13
        相关资源
        最近更新 更多