Python变量作用域为定义的变量提供了未定义的变量

问题描述 投票:0回答:3

为什么未定义此变量?使用global可以解决此问题(也需要设置global serviceFile),但是我认为如果要修改全局变量,则只需指定global

  File "./test_menu.py", line 18, in generateTemplateList
    serviceFilePath = templateDirectory + '/' + directory + '/' + serviceFile
NameError: name 'templateDirectory' is not defined
#!/usr/bin/env python3

import os

# Constants
templateDirectory = './.templates'
serviceFile = 'service.yml'

menu = []
templateDirectoryFolders = next(os.walk(templateDirectory))[1]

def generateTemplateList(templateDirectoryFolders):
  templateListDirectories = []
  for directory in templateDirectoryFolders:
    serviceFilePath = templateDirectory + '/' + directory + '/' + serviceFile
    if os.path.exists(serviceFilePath):
      templateListDirectories.append(directory)

  return templateListDirectories

templatesList = generateTemplateList(templateDirectoryFolders)
for directory in templatesList:
  menu.append([directory, { "ticked": False }])

我也在函数中遇到类似的错误,例如:

def foo():
  return "hi"

def bar():
  print(foo())

bar()
  File "./test.py", line 6, in bar
    print(foo())
NameError: name 'foo' is not defined
python scope global-variables nameerror
3个回答
0
投票

检查缩进。

def foo():
    return "hi"

def bar():
    print(foo())

bar()

您具有用于缩进而非空格的制表符


0
投票

这是正确的标识

import os

# Constants
templateDirectory = './.templates'
serviceFile = 'service.yml'

menu = []
templateDirectoryFolders = next(os.walk(templateDirectory))[1]

def generateTemplateList(templateDirectoryFolders):
    templateListDirectories = []
    for directory in templateDirectoryFolders:
        serviceFilePath = templateDirectory + '/' + directory + '/' + serviceFile
        if os.path.exists(serviceFilePath):
            templateListDirectories.append(directory)

    return templateListDirectories

templatesList = generateTemplateList(templateDirectoryFolders)
for directory in templatesList:
    menu.append([directory, { "ticked": False }])


0
投票

结果是使用exec时是Python中的错误:https://bugs.python.org/issue4831

© www.soinside.com 2019 - 2024. All rights reserved.