Python变量的值不会在函数外部更改

时间:2020-05-31 21:57:10

标签: python arrays class variables constructor

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

#__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()

3 个答案:

答案 0 :(得分:0)

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

有关范围herehere的更多信息。

答案 1 :(得分:0)

请考虑以下代码。在下面的代码中,您可能会更改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

答案 2 :(得分:0)

修改后的代码可纠正一些问题。

  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()