缩进变量的赋值

时间:2019-08-01 16:07:10

标签: python

一个非常简单的问题(至少我认为是这样):所以我有一个全局变量,在这种情况下为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”。 这是如何工作的,为什么第一个代码示例不起作用? 有什么方法可以使用我想要的第一个代码?

5 个答案:

答案 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)

因此字典没有被修改。它与列表的工作方式相同(我想与支持项目分配的所有可迭代对象一样)

我试图简化,实际上更加复杂,但是它可能会教给我一些我希望的东西。