代码之家  ›  专栏  ›  技术社区  ›  Austin

赋值前的全局变量和引用

  •  -1
  • Austin  · 技术社区  · 6 年前

    我正在尝试创建一个空的全局熊猫数据帧,然后在数据处理函数中附加到它。我很难弄清楚出了什么问题。下面是一个最小的例子:

    from datetime import datetime
    import pandas as pd
    
    def do_stuff_and_append_df():
        dt = datetime.now()
        row = dict.fromkeys(df.columns.tolist())
        row['datetime'] = dt
        row['pduType'] = 'blah'
        df = df.append(row, ignore_index=True)
        print(df.head())
    
    def main():
        # empty dataframe for appending
        header = ['datetime', 'pduType']
        global df 
        df = pd.DataFrame(columns=header)
        # Main loop
        try:
            while True:
                do_stuff_and_append_df()
    
        except KeyboardInterrupt:
            print('\nSaving and exiting.')
            df.to_csv('data.csv')
    
    main()
    

    我得到了错误 UnboundLocalError: local variable 'df' referenced before assignment . 有人知道我为什么打不到电话吗 df 在这个函数中?

    4 回复  |  直到 6 年前
        1
  •  2
  •   vijay lingam    6 年前

    您还必须在函数do_tuff_和_append_df()下声明“global df”。

    因为函数do_stuff_和_append_df()不知道您是在引用局部变量还是全局变量。

        2
  •  1
  •   chepner    6 年前

    更好的是, 不使用全局变量 . 将所需的数据帧作为参数传递。

    from datetime import datetime
    import pandas as pd
    
    def do_stuff_and_append_df(df):
        dt = datetime.now()
        row = dict.fromkeys(df.columns.tolist())
        row['datetime'] = dt
        row['pduType'] = 'blah'
        df = df.append(row, ignore_index=True)
        print(df.head())
        return df
    
    def main():
        # empty dataframe for appending
        header = ['datetime', 'pduType']
        df = pd.DataFrame(columns=header)
        # Main loop
        try:
            while True:
                df = do_stuff_and_append_df(df)
    
        except KeyboardInterrupt:
            print('\nSaving and exiting.')
            df.to_csv('data.csv')
    
    main()
    
        3
  •  1
  •   Andy Chang    6 年前

    尝试在中添加全局声明 do_stuff_and_append_df

    def do_stuff_and_append_df():
        global df
    
        4
  •  0
  •   C.Nivs    6 年前

    如果需要全局变量,请将其显式地放在全局范围中:

    from datetime import datetime
    import pandas as pd
    
    def do_stuff_and_append_df():
        dt = datetime.now()
        row = dict.fromkeys(df.columns.tolist())
        row['datetime'] = dt
        row['pduType'] = 'blah'
        df = df.append(row, ignore_index=True)
        print(df.head())
    
    def main():
        # Main loop
        try:
            while True:
                do_stuff_and_append_df()
    
        except KeyboardInterrupt:
            print('\nSaving and exiting.')
            df.to_csv('data.csv')
    
    if __name__ == "__main__":
        header = ['datetime', 'pduType']
        df = pd.DataFrame(columns=header)
    

    要么,要么看看切普纳的答案。你最好 不要 使用全局变量