一个非常简单的问题(至少我认为是这样):所以我有一个全局变量,在这种情况下为test
,我想在函数中为其分配另一个值。这是我的代码:
test = "Hello"
def launch():
test = "F"
launch()
print(test)
我希望test
等于“ F”,但事实并非如此。相反,其输出是test
仍等于“ Hello”。我假设它在函数内部创建了一个变量,然后为其分配了一个值。
但是,为什么这样做有效?
test = {
"?": "Hallo"
}
def launch():
test["?"] = "F"
launch()
print(test)
这是我希望的输出:test["?"]
等于“ F”。
这是如何工作的,为什么第一个代码示例不起作用?
有什么方法可以使用我想要的第一个代码?
答案 0 :(得分:2)
您需要在函数顶部添加一个global test
行,以告知它引用现有变量而不是创建新变量。否则,这是模棱两可的。
第二个为什么起作用?因为它不是模棱两可的。从上下文来看,它知道您必须引用一个现有变量,而不是尝试创建一个新变量。
test["?"] = "F"
本质上是
test.__setItem__("?", "F")
,只有在test
已经存在的情况下才有意义。它知道您不是要创建新的局部变量。
在无法分辨您是否要使用现有变量或创建新变量的情况下,该语言仅需要使用global test
语句。
答案 1 :(得分:0)
在Python中,仅在函数内被引用的变量是隐式全局的。但是,如果将变量赋值是函数体内任意位置的值,除非明确声明为全局变量,否则将假定它是局部变量。
因此,请如下更改:
test = "Hello"
def launch():
global test
test = "F"
答案 2 :(得分:0)
在第二个示例中,您没有声明字典(例如test = {}
)。因此,python寻找全局变量test
。您可以通过以下方式访问全局变量:
def launch():
global test
test = "F"
答案 3 :(得分:0)
在第一种情况下,您尝试访问全局变量,但您也已将其重新声明为局部变量。
test = "Hello" #global variable by default.
def launch():
test = "F" # local variable by default. It's restricted to the function launch().
launch()
print(test) # Accessing global variable because print can't see test of launch.
test = "Hello" #global variable by default.
def launch():
global test
test = "F" # Accessing global value of test.
launch()
print(test) # Accessing global variable test.
在第二种情况下,您将分配给全局变量,而不是将其重新声明为局部变量。在于谎言。
test = {'?':"Hello"} #global variable by default.
def launch():
test['?'] = "F" # global variable access by default. It's NOT restricted to the function launch().
launch()
print(test) # Accessing global variable.
答案 4 :(得分:0)
在第一个测试的启动函数中,将重新创建test
变量,而没有指向全局函数的链接。这是python的特殊性。
如果您想更改全局功能,您应该这样做:
def launch():
global test
test = 'F'
第二次测试中,test
是一本字典。
是的,当您在函数中更改字典而不将其声明为全局变量时,它也会在函数外部更改字典。
如果您想知道真正的原因,那么如果您不懂C语言,那就更复杂了……Python是用C编程的(至少对于CPython来说),而用C编程的变量与Python。
在C语言中,当您要修改函数中的变量时,必须将变量的内存地址作为参数(该变量称为指针)提供给函数。
如果不将全局变量的指针提供给要修改它的函数,它将无法正常工作。
在第一个示例中调用launch
函数时,未修改测试,因为没有将test
声明为全局变量,因此python没有给出{{1 }} test
函数(仅其值)。
当您使用字典时,Python还将给出字典的值,但是它将是指向其元素的指针。这样您就可以修改它们。
这就是为什么您可以修改字典中的元素,但是不能修改字典的原因。示例:
launch
导致:
a = {"a":123, 'b':456}
def modif():
a = {"aa":123}
modif()
print(a)
因此字典没有被修改。它与列表的工作方式相同(我想与支持项目分配的所有可迭代对象一样)
我试图简化,实际上更加复杂,但是它可能会教给我一些我希望的东西。