我正在使用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'}
有没有一种方法可以使第二个代码的结果与第一个相同,而没有返回值或全局值?
答案 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'}
尽管此代码可能需要重构,但如果可以的话,名称不应与函数内部紧密耦合。