我对python相当陌生,我想知道局部变量是如何工作的。让我们从一个简单方法的示例开始:
def do_sth():
local_dict = { 'a': 1, 'b': 2, 'c': 3, ... }
...
让我们假设local_dict像一种常量变量一样使用。这里有一个问题:它是在每次调用do_sth()时创建的,还是创建一次并保存在do_sth()内部的某个地方?
局部变量始终在函数范围内创建。一旦程序计数器退出函数(局部变量的作用域),垃圾收集器就会收集这些数据。
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, ... }
每次调用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()}
从技术上讲,每个人都可以访问它,但更清楚它属于什么。
您可以使用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的设计者是否有任何理由认为不应为局部变量提供默认值?认真地讲,如果实例变量可以被赋予默认值,那为什么我们不能对局部变量做同样的事情呢? 问题答案: 声明局部变量主要是为了进行一些计算。因此,程序员决定设置变量的值,并且不应采用默认值。如果程序员错误地没有初始化局部变量并且使用默认值,则输出可能是一些意外值。因此,在使用局部变量的情况下,编译器将要求程序员在访问变量之前使用一些值