python中带有setdefault的全局变量
我对python中使用if setdefault()时全局变量的行为有点困惑: 请查找如何使用setdefault引用/解决此问题的示例代码,有人能帮我澄清这里发生了什么吗 解析变量的主文件:python中带有setdefault的全局变量,python,variables,global,setdefault,Python,Variables,Global,Setdefault,我对python中使用if setdefault()时全局变量的行为有点困惑: 请查找如何使用setdefault引用/解决此问题的示例代码,有人能帮我澄清这里发生了什么吗 解析变量的主文件: #main from test import * fill_func() print my_list print my_dict 为变量赋值的测试文件: #test my_list = [] my_dict = {} def fill_func(): my_list = [1,2,3]
#main
from test import *
fill_func()
print my_list
print my_dict
为变量赋值的测试文件:
#test
my_list = []
my_dict = {}
def fill_func():
my_list = [1,2,3]
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
输出:
[1, 2, 3]
{0: ['zero']}
[]
{0: ['zero']}
我无法理解为什么从main.py调用list(my_list)变量时会显示为空,而my_dict显示的数据很好
感谢您的帮助。蒂亚
#
样本测试文件2
#test
my_list = []
my_dict = {}
def fill_func():
def fill_list():
global my_list
my_list = [1,2,3]
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
fill_list()
输出:
{0: ['zero']}
[1, 2, 3]
[]
{0: ['zero']}
有人能帮我解释一下第二个测试文件吗,请耐心听我说,试着理解基本知识:)
蒂亚
my_list
被定义为fill_func
中的局部变量;这是对全局范围中定义的另一个my_列表的阴影
因此,您的代码首先调用打印本地
my\u list
的fill\u func
,然后调用默认dict。然后退出该函数并打印外部作用域my\u list
,dict(没有阴影)my\u list
被定义为fill\u func
中的局部变量;这是对全局范围中定义的另一个my_列表的阴影
因此,您的代码首先调用打印本地
my\u list
的fill\u func
,然后调用默认dict。然后退出函数并打印外部作用域my\u list
,以及dict(没有阴影)您需要在函数中声明要使用全局变量
你可以这样做
def fill_func():
global my_list
global my_dict
my_list = [1,2,3]
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
请注意,通常情况下,最好只使用大写字母表示全局变量,以避免混淆您需要在函数中声明要使用全局变量 你可以这样做
def fill_func():
global my_list
global my_dict
my_list = [1,2,3]
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
请注意,通常情况下,最好只对全局变量使用大写字母,以避免混淆您正在创建一个与全局变量同名的局部变量。只需在函数顶部添加
global my_list
。您正在创建一个与全局变量同名的局部变量。只需在函数顶部添加global my_list
。这是因为,正如您正确指出的,它与范围有关my_list
和my_dict
对于test.py
是全局的,必须使用global
限定符来访问。也就是说,您的代码应该是:
# Edited to address comments (see explanation below)
def fill_func():
global my_list # this is necessary since you're updating the values
global my_dict
my_list.extend([1,2,3])
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
编辑:
要更新列表和字典,必须扩展列表并修改字典(正如您所做的那样)——即实际更改其值。使用赋值运算符为其赋值只会更改变量引用的内容,而不会更改值本身。这就是为什么它不会在本地函数范围之外更新。这也是为什么当我们使用其他方法修改这些变量的内容时,它会更新
问题是当解析函数体时使用了所有变量
在正常分配或扩充分配中,被视为
局部变量,因此当函数被调用时,Python不会
对于全局范围内的那些变量,它将引发一个错误。
因此,您需要将这些变量指定为全局变量,以告诉Python
在全球范围内寻找它们
另一种选择是使用list.extend()
(从这里:。在这方面有用的另一个参考是:)
只要没有全局变量,就始终可以访问全局变量
同名的局部变量。您只需要全局语句
当您要更改变量名所指的对象时
与此版本相比:
def fill_func():
global my_list
global my_dict
my_list = [1,2,3]
print my_list # prints `[1, 2, 3]` here and `[]` in main
my_dict = {1: 'a', 2: 'b'}
print my_dict # prints `{1: 'a', 2: 'b'}` here, and `{}` in main
如果不使用
global
,Python会认为变量是定义它的代码元素范围的局部变量,因此global
告诉解释器查看globals
符号表(这些内容可以通过globals()
访问)这是因为,正如您正确指出的,它与范围有关my_list
和my_dict
对于test.py
是全局的,必须使用global
限定符来访问。也就是说,您的代码应该是:
# Edited to address comments (see explanation below)
def fill_func():
global my_list # this is necessary since you're updating the values
global my_dict
my_list.extend([1,2,3])
print my_list
my_dict.setdefault(0,[]).append('zero')
print my_dict
编辑:
要更新列表和字典,必须扩展列表并修改字典(正如您所做的那样)——即实际更改其值。使用赋值运算符为其赋值只会更改变量引用的内容,而不会更改值本身。这就是为什么它不会在本地函数范围之外更新。这也是为什么当我们使用其他方法修改这些变量的内容时,它会更新
问题是当解析函数体时使用了所有变量
在正常分配或扩充分配中,被视为
局部变量,因此当函数被调用时,Python不会
对于全局范围内的那些变量,它将引发一个错误。
因此,您需要将这些变量指定为全局变量,以告诉Python
在全球范围内寻找它们
另一种选择是使用list.extend()
(从这里:。在这方面有用的另一个参考是:)
只要没有全局变量,就始终可以访问全局变量
同名的局部变量。您只需要全局语句
当您要更改变量名所指的对象时
与此版本相比:
def fill_func():
global my_list
global my_dict
my_list = [1,2,3]
print my_list # prints `[1, 2, 3]` here and `[]` in main
my_dict = {1: 'a', 2: 'b'}
print my_dict # prints `{1: 'a', 2: 'b'}` here, and `{}` in main
如果不使用
global
,Python会认为变量是定义它的代码元素范围的局部变量,因此global
告诉解释器查看globals
符号表(这些内容可以通过globals()
访问)您提出的解决方案不起作用,我认为这个shd很好,但它不起作用!,艾尔