首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python变量不变

Python变量不变
EN

Stack Overflow用户
提问于 2015-12-02 22:05:26
回答 3查看 136关注 0票数 0

我正在尝试做一个数据记录代码,让用户输入动物的数量和年龄,出生率和它们在这一代中存活的机会。我曾尝试使用return,但当我运行程序时,变量仍然为0。

在这里,我初始化了变量

代码语言:javascript
复制
Gen0_J=0
Gen0_A=0
Gen0_S=0
Birth_rate=0
Srate_J=0
Srate_A=0
Srate_S=0
New_generations=5

我的第一个函数

代码语言:javascript
复制
def generation_values():
    Gen0_J=int(input("How many juveniles in Generation 0? "))
    Gen0_A=int(input("How many adults in Generation 0? "))
    Gen0_S=int(input("How many seniles in Generation 0? "))
    Srate_J=float(input("What is the survival rate for juveniles? "))
    Srate_A=float(input("What is the survival rate for adults? "))
    Srate_S=float(input("What is the survival rate for seniles? "))
    Birth_rate=int(input("What is the birth rate? "))
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate

显示变量

代码语言:javascript
复制
def display_values():
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J)
    print("The amount of adults in Generation 0 is",Gen0_A)
    print("The amount of seniles in Generation 0 is",Gen0_S)
    print("The birth rate in Generation 0 is",Birth_rate)
    print("The survival rate for juveniles in Generation 0 is",Srate_J)
    print("The survival rate for adults in Generation 0 is",Srate_A)
    print("The survival rate for seniles in Generation 0 is",Srate_S)

generation_values()
display_values()

但是,变量保持为0

代码语言:javascript
复制
How many juveniles in Generation 0? 5
How many adults in Generation 0? 6
How many seniles in Generation 0? 7
What is the survival rate for juveniles? 0.75
What is the survival rate for adults? 1
What is the survival rate for seniles? 0
What is the birth rate? 2

The amount of juveniles in Generation 0 is 0
The amount of adults in Generation 0 is 0
The amount of seniles in Generation 0 is 0
The birth rate in Generation 0 is 0
The survival rate for juveniles in Generation 0 is 0
The survival rate for adults in Generation 0 is 0
The survival rate for seniles in Generation 0 is 0
EN

回答 3

Stack Overflow用户

发布于 2015-12-02 22:10:09

变量的作用域不正确。[在函数、类或模块中声明的变量在程序的更高级别上是不可访问的-这里是super_biased_man在注释中发布的a short description of python scoping rules ]-在这种情况下,您在generation_values()中赋值的变量是本地定义的。

这样做肯定不是正确的方法,但在generation_values()中声明全局变量将解决您的问题:(定义这样做的“理想方式”取决于您在编程学习中处于什么位置,这会让我们走得太远)

代码语言:javascript
复制
Gen0_J=0
Gen0_A=0
Gen0_S=0
Birth_rate=0
Srate_J=0
Srate_A=0
Srate_S=0
New_generations=5


def generation_values():

    global Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate

    Gen0_J=int(input("How many juveniles in Generation 0? "))
    Gen0_A=int(input("How many adults in Generation 0? "))
    Gen0_S=int(input("How many seniles in Generation 0? "))
    Srate_J=float(input("What is the survival rate for juveniles? "))
    Srate_A=float(input("What is the survival rate for adults? "))
    Srate_S=float(input("What is the survival rate for seniles? "))
    Birth_rate=int(input("What is the birth rate? "))
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate


def display_values():
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J)
    print("The amount of adults in Generation 0 is",Gen0_A)
    print("The amount of seniles in Generation 0 is",Gen0_S)
    print("The birth rate in Generation 0 is",Birth_rate)
    print("The survival rate for juveniles in Generation 0 is",Srate_J)
    print("The survival rate for adults in Generation 0 is",Srate_A)
    print("The survival rate for seniles in Generation 0 is",Srate_S)

generation_values()
display_values()

处理这种情况的另一种方法是将变量作为参数传递给函数,并将赋值的值返回给它们。但是它们很多,传递它们可能会使您的代码变得混乱。

您还可以将它们收集到一个元组中,或者将它们包装在一个类中。

票数 1
EN

Stack Overflow用户

发布于 2015-12-02 22:16:31

变量的作用域不一致。

你可以这样做:

代码语言:javascript
复制
def generation_values():
    Gen0_J=int(input("How many juveniles in Generation 0? "))
    Gen0_A=int(input("How many adults in Generation 0? "))
    Gen0_S=int(input("How many seniles in Generation 0? "))
    Srate_J=float(input("What is the survival rate for juveniles? "))
    Srate_A=float(input("What is the survival rate for adults? "))
    Srate_S=float(input("What is the survival rate for seniles? "))
    Birth_rate=int(input("What is the birth rate? "))
    return Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate

def display_values(Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate):
    print("\nThe amount of juveniles in Generation 0 is",Gen0_J)
    print("The amount of adults in Generation 0 is",Gen0_A)
    print("The amount of seniles in Generation 0 is",Gen0_S)
    print("The birth rate in Generation 0 is",Birth_rate)
    print("The survival rate for juveniles in Generation 0 is",Srate_J)
    print("The survival rate for adults in Generation 0 is",Srate_A)
    print("The survival rate for seniles in Generation 0 is",Srate_S)

Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate = generation_values()
display_values(Gen0_J,Gen0_A,Gen0_S,Srate_J,Srate_A,Srate_S,Birth_rate)

将是第一步。

这样,"main“名称空间中的变量就与函数中的变量分开了。

消除重复的下一步可能是不关心主命名空间中变量的分隔,只需将它们视为一个元组:

代码语言:javascript
复制
data = generation_values()
display_values(*data)

进一步消除重复和引入清晰度的步骤可以包括:

  • 将数据组装到一个对象(命名元组或其他对象)中,并在object

的方法中请求和输出数据

票数 1
EN

Stack Overflow用户

发布于 2015-12-02 22:46:55

正如其他人所说,问题是对函数内部变量的赋值会创建新的变量,而不是将值赋给全局变量。这就是global关键字存在的原因。

在这种情况下,我会考虑使用一个类,因为您有许多共同操作的相关状态值。

代码语言:javascript
复制
class GenerationData(object):

    def __init__(self, gen_number):
        self.number = gen_number
        self.birth_rate = 0
        self.num_juveniles, self.num_adults, self.num_seniles = 0, 0, 0
        self.juvenile_rate, self.adult_rate, self.senile_rate = 0.0, 0.0, 0.0

    @classmethod
    def read(cls, gen_number):
        gen = cls(gen_number)
        gen.num_juveniles = read_integer(
            'How many juveniles in Generation {}?'.format(gen_number))
        gen.num_adults = read_integer(
            'How many adults in Generation {}?'.format(gen_number))
        gen.num_seniles = read_integer(
            'How many seniles in Generation {}?'.format(gen_number))
        gen.juvenile_rate = read_float(
            'What is the survival rate for juveniles? ')
        gen.adult_rate = read_float('What is the survival rate for adults? ')
        gen.senile_rate = read_float('What is the survival rate for seniles? ')
        gen.birth_rate = read_integer('What is the birth rate? ')

    def display(self):
        print('The amount of juveniles in Generation', self.number,
              'is', self.num_juveniles)
        print('The amount of adults in Generation', self.number,
              'is', self.num_adults)
        print('The amount of seniles in Generation', self.number,
              'is', self.num_seniles)
        print('The birth rate in Generation', self.number,
              'is', self.birth_rate)
        print('The survival rate for juveniles in Generation', self.number,
              'is', self.juvenile_rate)
        print('The survival rate for adults in Generation', self.number,
              'is', self.adult_rate)
        print('The survival rate for seniles in Generation', self.number,
              'is', self.senile_rate)


def read_integer(prompt):
    return int(raw_input(prompt))


def read_float(prompt):
    return float(raw_input(prompt))


first_generation = Generation.read(0)
first_generation.display()

当您操作生成数据时,这将使事情变得更容易,因为它都捆绑到单个对象中。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34044745

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档