python - python 如何在funchion外部更改字典,如果我在内部重新定义它?

89 5

我正在使用 python 3.6我有一个具有大量功能的代码。 在它们中,我使用一个字典作为参数。 所以,如果我在某个地方改变它它会在各个层面上发生变化 。 但是,在一个函数中,我需要将它替换为另一个函数,这就是出现问题的地方: 重新定义字典,brokes链接到主词典,并没有改变它的级别。 另外,我不能使用返回,因为它会重新定义字典,只需要一个级别。

所以:


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)



otputs ( 带,不返回):

 
{'1': '2'}



 

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

时间:

70 2

在你的dic上简单地做一个 x.update 方法:


def Teser(Test):


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



143 0

你正在重新分配参数,而不是全局变量,这是不正确的做法

它与这里等效,并且期望 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)



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

原作者:
52 0

你可以试试这个:


Test = {"1":"2"}



def Teser(Test):


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



Teser(Test)



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

50 0

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

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


class SomeClass:


 def __init__(self):


 SomeClass.test = {"1":"2"}



 @classmethod


 def teser(cls, test):


 cls.test["Hell"]="No"



原作者:
143 1

如果要修改全局变量,则不希望将它的作为参数传递。 如果传递该方法,该方法将创建一个名为"测试"的局部变量,并且只修改它。 即使你不把它作为参数传递,它也会创建一个局部变量。 在方法开始时使用全局变量写 global variable_name


Test = {"1":"2"}



def Teser():


 global Test


 Test = {"Hell":"No"}



Teser()


print(Test)



102 1

如果我正确理解你的要求你需要使用一个同名的本地字典,一旦工作完成在调用其他东西之前也会以某种方式更新全局 。


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



这段代码可能需要重构,如果你可以帮助它名称不应该紧密耦合在函数内部 。

原作者:
...