【问题标题】:Python variable's value doesn't get changed outside the functionPython 变量的值不会在函数之外更改
【发布时间】:2020-09-19 04:58:54
【问题描述】:

我正在做一个学校项目。我制作了我的程序的测试版本,因为我是 Python 新手,而且我只有 C# 的经验,所以我还在学习基础知识。我的问题如下: 在函数“Fill_Array()”之前,我声明了一个变量(“max_element_var”),它应该存储可以存储在数组(“content_array”)中的最大元素数。稍后在函数中,我将它的值更改为控制台的输入,这发生了,并且函数按原样运行,唯一的问题是在函数之外“max_element_var”的值保持“无”。我应该怎么做才能解决这个问题?

#__Test__#
def Test():
    class Que:
        def __init__(self, content, max_element ,actual_elements):
            self.content = content
            self.max_element = max_element
            self.actual_elements = actual_elements

    max_element_var = None
    content_array = []
    def Fill_array():
        print("What should be the max number of elements that can be stored in the array? (Type in an integer!)")
        max_element_var = int(input())
        if(max_element_var>0):
             import random
             random_var = random.randrange(0,max_element_var)
             for x in range(max_element_var-random_var):
                 content_array.append(x)             
        else:
            print("It has to be more than 0!")
            Fill_array()   
    Fill_array()

    actual_elements_var = len(content_array)

    que = Que (content_array, max_element_var, actual_elements_var)

    print("Content: ", que.content)
    print("Max number of elements: ", que.max_element)
    print("Actual number of elements: ", que.actual_elements)
#__Test__#

#__Full__#
def Full():
    pass
#__Full__#

#__Version_selector__#
def Version_selector():
    print("Which version should be used? (Type in the number!)")
    print("1 - Test")
    print("2 - Full")
    answer = int(input())
    if(answer == 1):
        Test()
        Version_selector()
    elif(answer == 2):
        Full()
        Version_selector()
#__Version_selector__#
Version_selector()

【问题讨论】:

  • 一些批评:1) 你在你的函数中声明一个本地类“Que”有什么原因吗?有例外but this is generally not a good idea and overly complicates your code。 2) 模块导入通常也不会在函数内部完成,即import random。 3)出于您的目的, Version_selector 不应该递归地调用自己。最好使用 while 循环。
  • @elitofsly--转换了上面的 cmets 以创建一个有助于简化事情的答案,希望如此。不要忘记Zen of Python

标签: python arrays class variables constructor


【解决方案1】:

在 python 中,变量在单独使用它们的函数范围内自动创建为本地变量。 为了解决您的问题,您可以 (1) 返回变量,将其从一个函数显式传递给另一个函数。 (2) 将其声明为全局,以便所有函数都可以访问它。

更多关于作用域herehere

【讨论】:

    【解决方案2】:

    考虑以下代码。在下面的代码中,您可能会更改 x 的值,但实际上函数内部和外部的 x 之间存在很大差异。函数内部的 x 是一个 local 变量,一旦函数结束就会“消失”。如果要保存 x 的值,则必须使用 return x 并将结果保存到变量中。例如,见函数a_saving_example(x)

    您也可以使用global 变量,尽管有人说它是bad practice,最好在您的函数中使用return

    def times_two(x):
        x = x * 2
    
    x = 5
    print(x)
    times_two(x)
    print(x)
    
    

    输出:

    5
    5
    

    保存示例:

    def a_saving_example(x):
        x = x * 2
        return x
    
    x = 5
    print(x)
    x = a_saving_example(x)
    print(x)
    

    输出:

    5
    10
    

    【讨论】:

      【解决方案3】:

      修改代码以纠正一些问题。

      1. 导入通常在模块顶部完成(不在函数内)
      2. 删除函数内的嵌套类定义(在简单代码中混淆事物)
      3. 将递归调用更改为 while 循环(这是一种在 Python 中从头开始重复执行函数的更好方法,因为没有尾递归)。

      代码重构

      import random
      
      class Que:
        def __init__(self, content, max_element ,actual_elements):
            self.content = content
            self.max_element = max_element
            self.actual_elements = actual_elements
      
      def Fill_array():
        " Returns requested size and array "
        while True:
          prompt = """"What should be the max number of elements that can be stored in the array?  Type in an integer!: """
          max_element_var = int(input(prompt))
          if max_element_var > 0:
            random_var = random.randrange(0,max_element_var)
            return max_element_var, [x for x in range(max_element_var-random_var)]
          else:
            print("It has to be more than 0!")
      
      def Test():
        max_element_var, content_array = Fill_array()
        actual_elements_var = len(content_array)
        que = Que (content_array, max_element_var, actual_elements_var)
      
        print("Content: ", que.content)
        print("Max number of elements: ", que.max_element)
        print("Actual number of elements: ", que.actual_elements)
      #__Test__#
      
      #__Full__#
      def Full():
          pass
      #__Full__#
      
      #__Version_selector__#
      def Version_selector():
        while True:
          prompt = """Which version should be used? (Type in the number!)
          1 - Test
          2 - Full
          3 - Quit\n\t"""
      
          answer = int(input(prompt))
          if answer == 1:
            Test()
          elif answer == 2:
            Full()
          else:
            break
      
      #__Version_selector__#
      Version_selector()
      

      【讨论】:

        猜你喜欢
        • 2022-01-21
        • 2019-12-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多