【问题标题】:How to change dictionary outside the funchion, if I redefine it inside?如果我在内部重新定义字典,如何在函数外部更改字典?
【发布时间】:2019-04-27 19:13:21
【问题描述】:

我正在使用 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'}

有没有办法使第二个代码结果与第一个相同,而不需要返回或全局?

【问题讨论】:

  • 也许是时候重构代码了?如果不是,这个变量,在做本地工作的时候,是不是必须和全局dict同名?
  • 不幸的是,它必须是这样的......

标签: python function dictionary


【解决方案1】:

您正在重新分配参数,而不是全局变量,无论如何这都是不好的做法

相当于这个,期待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)

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

【讨论】:

  • 您可能应该将字典和函数小写
【解决方案2】:

你可以试试这个:

Test = {"1":"2"}

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

Teser(Test)

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

【讨论】:

    【解决方案3】:

    只需在您的 dic 上执行 x.update 方法,例如:

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

    【讨论】:

      【解决方案4】:

      有没有办法使第二个代码结果与第一个相同,而不需要返回或全局变量?

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

      class SomeClass:
          def __init__(self):
              SomeClass.test = {"1": "2"}
      
          @classmethod
          def teser(cls, test):
              cls.test["Hell"]= "No"
      

      【讨论】:

        【解决方案5】:

        如果你想修改一个全局变量,你不会想把它作为参数传递。如果你传递它,该方法会创建一个名为“Test”的局部变量,并且只修改它。即使您不将其作为参数传递,它也会创建一个局部变量。要使用全局变量,请在方法的开头写入 global variable_name

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

        【讨论】:

          【解决方案6】:

          如果我正确理解您的要求,您需要使用同名的本地 dict,并且一旦工作完成,在调用其他内容之前也以某种方式更新全局。

          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'}
          

          虽然此代码可能需要重构,但如果您能提供帮助,名称不应在函数内部如此紧密耦合。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-15
            • 2014-09-14
            • 1970-01-01
            • 1970-01-01
            • 2019-03-27
            • 2016-10-30
            • 2020-05-27
            • 1970-01-01
            相关资源
            最近更新 更多