【问题标题】:int(input()) error - NameError: name '…' is not definedint(input()) 错误 - NameError: name '...' is not defined
【发布时间】:2018-06-20 15:24:06
【问题描述】:

当我尝试运行这个简单的 python 脚本时出现错误:

def ask_x():
    x = int(input('What is X?'))

def ask_y():
    y = int(input('What is Y?'))

def result():
    print(z)

def count():
    if (x>10):
        z = x + y
    else:
        z = 0
        print('nono')


#start of program
ask_x()
ask_y()
count()
result()

我使用的是 Python 3。我尝试搜索论坛并找到了 Stackoverflow - input() error - NameError: name '…' is not defined ,但它对我不起作用。

【问题讨论】:

  • 您的变量只存在于函数的本地范围内。因此在它之外不为人所知。

标签: python python-3.x


【解决方案1】:

这是因为您的变量在本地范围内。您无法在ask_x() 函数之外访问x

我建议您阅读函数以更好地掌握这一点。

def ask_x():
    return int(input('What is X?'))

def ask_y():
    return int(input('What is Y?'))

def result(z):
    print(z)

def count(x, y):
    if (x>10):
        return  x + y
    else:
        print('nono')
        return 0


#start of program
x = ask_x()
y = ask_y()
z = count(x, y)
result(z)

这将获取每个函数中的值,但是,不是将它们存储在本地范围内,而是将其返回给主函数并存储在相应的变量中。

然后您可以将xy 作为参数发送到count(),处理好您的逻辑,并返回要存储为z 的值。

我希望这是有道理的!

【讨论】:

    【解决方案2】:

    绕过作用域的一种方法是从函数中返回您需要的变量并将其传递到需要的地方。我更喜欢使用全局变量:

    def ask_x():
        return int(input('What is X?'))
    
    def ask_y():
        return int(input('What is Y?'))
    
    def result(z):
        print(z)
    
    def count(x,y):
        if (x>10):
            z = x + y
        else:
            z = 0
            print('nono')
        return z
    
    #start of program
    x = ask_x()
    y = ask_y()
    z = count(x,y)
    result(z)
    

    最好使用How to ask user for valid input 中提供的一种方式来获取您的输入:

    def askInt(text):
        """Asks for a valid int input until succeeds."""
        while True:
            try:
                num = int(input(text))
            except ValueError:
                print("Invalid. Try again.") 
                continue
            else:
                return num
    
    x = askInt("What is X?") 
    y = askInt("What is Y?")
    

    通过这种方式,您可以传入不断变化的值(文本),并从变量解析和验证中获益。

    【讨论】:

      【解决方案3】:

      如果你不想返回,那么只需用一些默认值初始化变量

      x=0
      y=0
      z=0
      def ask_x():
          global x
          x = int(input('What is X?'))
      
      def ask_y():
          global y
          y = int(input('What is Y?'))
      
      def result():
          global z
          print(z)
      
      def count():
          global x,y,z
          if (x>10):
              z = x + y
          else:
              z = 0
              print('nono')
      
      
      #start of program
      ask_x()
      ask_y()
      count()
      result()
      

      【讨论】:

      • 除非在函数中将 x/y/z 声明为 global,否则不起作用。
      • 是的,没有意识到这一点。谢谢
      【解决方案4】:

      Python 遵循函数作用域,不像其他一些语言,如 c 遵循块作用域。这意味着在函数内部定义的变量不能在外部访问。除非它们是全局定义的。

      解决您的问题: 您可以在函数中返回它们并将它们存储在全局范围内的变量中,或者将所有输入语句放在单个函数中。

      【讨论】:

        猜你喜欢
        • 2020-11-07
        • 2022-11-27
        • 2022-12-02
        • 1970-01-01
        相关资源
        最近更新 更多