【问题标题】:Why do some variables need to global while others don't?为什么有些变量需要全局变量而其他变量不需要?
【发布时间】:2016-08-12 17:19:34
【问题描述】:

在下面的代码中,为什么我必须在函数内部将num 变量设置为global 而不是folderrename_prefix?如果我从函数中删除globalnum 不能在函数中使用,但folderrename_prefix 变量仍然可以吗?我不明白。有人可以解释我对全局变量和局部变量的误解。谢谢

import os

# User Input
folder = r'F:\Pictures\2016\iPhone Pics\rename_test'
rename_prefix = 'Renamed_' # ENTER WHAT YOU WANT PREFIX OF IMAGE TO BE
num = 0

def file_renamer():
    global num
    for root, dir2, files in os.walk(folder):
        print 'Renaming Files in {} \n'.format(root)
        if len(dir2) > 0:
            print 'Found the following sub folders {} \n'.format(dir2)
        #print 'Found {} subfolders named {} and {}'.format(len(dir2),dir2[0],dir2[1])
        #num = 0 uncomment if you want each folder to start renaming files at 0
        for x in files:
            local_folder = os.path.join(folder, root)
            old = os.path.join(local_folder, x)
            #if x.startswith('IMG'):

            if old.lower().endswith(('.jpg')):

                print 'Renaming {0}'.format(x)
                num2 = '{0}.jpg'.format(num)
                rename_name = rename_prefix + num2
                rename_path = os.path.join(local_folder, rename_prefix + num2)
                os.rename(old, rename_path)
                print 'Successfully renamed {0} to {1} \n'.format(x, rename_name)
                num += 1
            elif old.lower().endswith('.png'):
                print 'Renaming {0}'.format(x)
                num2 = '{0}.png'.format(num)
                rename_name = rename_prefix + num2
                rename_path = os.path.join(local_folder, rename_prefix + num2)
                os.rename(old, rename_path)
                print 'Successfully renamed {0} to {1} \n'.format(x, rename_name)
                num += 1

            elif old.lower().endswith('.mov'):
                print 'Renaming {0}'.format(x)
                num2 = '{0}.mov'.format(num)
                rename_name = rename_prefix + num2
                rename_path = os.path.join(local_folder, rename_prefix + num2)
                os.rename(old, rename_path)
                print 'Successfully renamed {0} to {1} \n'.format(x, rename_name)
                num += 1

            else:
                print 'IDK what file type {0} is !!, skipping...'.format(x)
                continue
            #else:
                #print '{} Does not meet renaming criteria, moving to next file'.format(x)
                #continue

    print 'Finished Renaming all files in {}'.format(folder)


file_renamer()enter code here

【问题讨论】:

  • 因为你永远不会改变folderrename_prefix的值。
  • 你不修改folderrename_prefix,所以你不需要global。但是您正在函数内部更新num,因此您需要使用global

标签: python global-variables


【解决方案1】:

正如 cmets 中的人指出的那样,您不需要将 global 用于 folderrename_prefix 但您需要使用 num 的原因是您只阅读前两个而你设置的是后者。

如果您没有声明 num 全局,那么会发生的情况是对 num 的赋值将创建并分配给一个新的局部变量 num,它会影响全局 num,而不是实际设置如您所料,已定义的全局 num 的值。

【讨论】:

    【解决方案2】:
    x = 0
    
    def function_name():
        x = 2
    
    
    function_name()
    
    x #yields:0
    

    但如果你定义:

    def function_name():
        global x
        x = 2
    

    然后执行

    function_name()
    x #yields 2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-24
      • 1970-01-01
      • 2021-07-13
      • 2014-06-20
      • 2019-12-18
      • 2015-08-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多