当前位置: 首页 > 知识库问答 >
问题:

Python局部变量初始化

欧阳俊明
2023-03-14

我对python相当陌生,我想知道局部变量是如何工作的。让我们从一个简单方法的示例开始:

def do_sth():
    local_dict = { 'a': 1, 'b': 2, 'c': 3, ... }
    ...

让我们假设local_dict像一种常量变量一样使用。这里有一个问题:它是在每次调用do_sth()时创建的,还是创建一次并保存在do_sth()内部的某个地方?

共有3个答案

申昌勋
2023-03-14

局部变量始终在函数范围内创建。一旦程序计数器退出函数(局部变量的作用域),垃圾收集器就会收集这些数据。

global_dict = []

def do_sth():
    local_dict = { 'a': 1, 'b': 2, 'c': 3, ... }
    ...

def do_other_task():
   #local_dict not visible. It's outside of scope. 
   global global_dict # fetch memory address of previously declared global_dict
   global_dict = { 'a': 1, 'b': 2, 'c': 3, ... }
通典
2023-03-14

每次调用do\u sth()时。这一点很重要,因为它允许您在函数内部修改local\u dict,并且不会对其他调用产生任何影响。解释器不够聪明,无法判断您是否会更改它,特别是因为Python是如此动态,有一些非常迂回的方法可以使它更改。

以下是您如何向自己证明词典不断被重新创建的方法:

def print_3():
    print(3)

def do_sth():
    local_dict = {'a': print_3()}

do_sth()
do_sth()
do_sth()

这张照片是3。。。三次。

我认为全局变量可以优化这一点,但如果你真的想,那么这个怎么样:

def do_sth():
    return do_sth.local_dict

do_sth.local_dict = {'a': print_3()}

从技术上讲,每个人都可以访问它,但更清楚它属于什么。

令狐唯
2023-03-14

您可以使用dis模块查看解释器的工作:

def do_sth():
    d = {'a':2, 'b':3}
    print(id(d))


import dis
dis.dis(do_sth)

将打印

  2           0 BUILD_MAP                2
              3 LOAD_CONST               1 (2)
              6 LOAD_CONST               2 ('a')
              9 STORE_MAP           
             10 LOAD_CONST               3 (3)
             13 LOAD_CONST               4 ('b')
             16 STORE_MAP           
             17 STORE_FAST               0 (d)

  3          20 LOAD_GLOBAL              0 (id)
             23 LOAD_FAST                0 (d)
             26 CALL_FUNCTION            1
             29 PRINT_ITEM          
             30 PRINT_NEWLINE       
             31 LOAD_CONST               0 (None)
             34 RETURN_VALUE        

这表明解释器在每次调用函数时都在重建值。

 类似资料:
  • 问题内容: UI类在View中,导入已完成,但是在最后一个表达式中我得到了错误。 我是Java的入门者,但我不明白为什么我不允许这样使用它。 问题答案: 如果要在Java方法中声明变量/对象,则需要对其进行初始化。 简单来说 在您的情况下,它是一个正在访问方法的对象,因此,如果不初始化它,就像 它会给你一个NULL指针异常。 希望能帮助到你。

  • 问题内容: 我了解Python中局部变量和全局变量的概念,但是我只是有一个问题,为什么下面的代码中会出现错误?Python逐行执行代码,因此在读取第5行之前,它不知道a是局部变量。Python尝试执行第5行后,会回退一行并将其标记为错误吗? 问题答案: 设置和测试 为了分析您的问题,让我们创建两个独立的测试函数来复制您的问题: 版画。因此,调用此函数不是问题,而是在下一个函数上: 我们收到一个错误

  • 考虑到下面的代码,为什么即使优惠券、偏移量和基已在if语句中初始化,编译器仍会在第5行抱怨?由于“percent”变量的默认值为0.0,因此if语句将运行并设置这些值。

  • 问题内容: 此代码为何起作用: 但这给出了“分配前引用的局部变量’var’”错误: 问题答案: 因为在第一个代码中,您已经创建了一个局部变量并使用了它的值,而在第二个代码中,您正在使用局部变量,而没有对其进行定义。 因此,如果要使第二个功能正常工作,则需要声明:- 在使用该功能之前。 而在此代码中: 更新 :- 但是,按照@Tim的注释,您不应在函数内部使用变量。最好在使用变量之前先定义变量,然后

  • print语句会导致以下编译时错误, 局部变量f可能尚未初始化 如果Java中的原语已经有一个默认值(float=0.0f),为什么我需要定义一个呢? 所以,这是有效的 谢谢大家!

  • 问题内容: Java的设计者是否有任何理由认为不应为局部变量提供默认值?认真地讲,如果实例变量可以被赋予默认值,那为什么我们不能对局部变量做同样的事情呢? 问题答案: 声明局部变量主要是为了进行一些计算。因此,程序员决定设置变量的值,并且不应采用默认值。如果程序员错误地没有初始化局部变量并且使用默认值,则输出可能是一些意外值。因此,在使用局部变量的情况下,编译器将要求程序员在访问变量之前使用一些值