如果我在内部重新定义字典,该如何在函数外部更改字典?

时间:2019-04-27 19:13:22

标签: python function dictionary

我正在使用Python 3.6 我有很多功能级别的代码。在所有这些书中,我都使用一本词典作为参数。因此,如果我在某处进行更改,则它会在各个级别下更改。但是,在一个函数中,我需要将其替换为另一个函数,这就是出现问题的地方:在内部重新定义字典,断开与主字典的链接,并且不降低其级别。另外,我不能使用return,因为它将重新定义字典,仅向下一层。

所以:

Test = {"1":"2"}

def Teser(Test):
    Test["Hell"]= "No"

Teser(Test)
print(Test)

此输出:

{'1': '2', 'Hell': 'No'}

但是

Test = {"1":"2"}

def Teser(Test):
    Test = {"Hell":"No"}

Teser(Test)
print(Test)

输出(有回报和无回报):

{'1': '2'}

有没有一种方法可以使第二个代码的结果与第一个相同,而没有返回值或全局值?

6 个答案:

答案 0 :(得分:2)

您要重新分配参数,而不是全局变量,这仍然是一种不好的做法

等同于此,并且期望Test发生变化

Test = {"1":"2"}
def Teser(t):
    t = {"Hell":"No"}
Teser(Test)

即使这样行​​之有效,您也会丢失密钥"1",我不确定这是问题的一部分...

无论如何,建议在此处使用全局名称,并使用其他参数名称

Test = {"1":"2"}
def Teser(t):
    # you can still reference t values, if needed 
    global Test  # while not necessary, it clarifies which variable scope is used 
    Test = {"Hell":"No"}
Teser(Test)
print(Test)

请注意:只有类应大写,而不是变量和函数

答案 1 :(得分:1)

您可以尝试以下方法:

Test = {"1":"2"}

def Teser(Test):
    Test.update({"Hell":"No"} , last = True)

Teser(Test)

这将在字典的开头添加键“地狱”。

答案 2 :(得分:0)

  

有没有一种方法可以使第二个代码的结果与第一个相同,而没有返回值或全局值?

在大多数情况下,您可能应该使用return。但是,如果函数嵌套的非常多,则可以使用悬挂类轻松模拟全局变量:

class SomeClass:
    def __init__(self):
        SomeClass.test = {"1": "2"}

    @classmethod
    def teser(cls, test):
        cls.test["Hell"]= "No"

答案 3 :(得分:0)

如果要修改全局变量,则不想将其作为参数传递。如果通过它,该方法将创建一个名为“ Test”的局部变量,并且仅对其进行修改。即使您不将其作为参数传递,它也会创建一个局部变量。要使用全局变量,请在方法开始时写入global variable_name

Test = {"1":"2"}

def Teser():
    global Test
    Test = {"Hell":"No"}

Teser()
print(Test)

答案 4 :(得分:0)

只需在dic上执行x.update方法即可,

def Teser(Test):
    Test.update({'Hell':'No'})

答案 5 :(得分:0)

如果我正确理解了您的要求,则需要使用同名的本地字典,一旦工作完成,在以其他方式调用之前,还要以某种方式更新全局变量。

Test = {"1":"2"}

def update_global(local_dict):
    global Test
    Test.update(local_dict)
    return Test

def Teser(Test):
    Test = {"Hell":"No"}
    #do work
    Test_local = Test.copy() #incase you still need to access the local variables for some reason
    Test = update_global(Test)
    #do some other work. If you need the local test back, just reassign.

Teser(Test)
print(Test)
#{'1': '2', 'Hell': 'No'}

尽管此代码可能需要重构,但如果可以的话,名称不应与函数内部紧密耦合。