Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中带有setdefault的全局变量_Python_Variables_Global_Setdefault - Fatal编程技术网

python中带有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]

我对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]
    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很好,但它不起作用!,艾尔