在Python中设置函数外部的变量

在Python中设置函数外部的变量,python,scope,namespaces,global-variables,Python,Scope,Namespaces,Global Variables,假设我们有这样一个结构: x = "" def xy(): x = "String" x = "" def xy(): global x = "String" 现在,当调用xy()并随后打印x时,它是空的。 尝试将变量声明为全局变量,如下所示: x = "" def xy(): x = "String" x = "" def xy(): global x = "String" 产生无效语法的语法错误。 为什么? 提前感谢您的帮助。为什么不尝试将变量传递给修

假设我们有这样一个结构:

x = ""
def xy():
    x = "String"
x = ""
def xy():
    global x = "String"
现在,当调用xy()并随后打印x时,它是空的。
尝试将变量声明为全局变量,如下所示:

x = ""
def xy():
    x = "String"
x = ""
def xy():
    global x = "String"
产生无效语法的语法错误。 为什么?


提前感谢您的帮助。

为什么不尝试将变量传递给修改函数:

x = ''
def xy(x):
    x += "String"
    return x
x = xy(x)
print(x)
这定义了一个函数,该函数接受输入
x
,然后在修改后返回。然后将修改后的值重新分配给超出范围的
x
。也许一个更清楚的例子会是这样的

x = 'My input' # create an initial variable
def xy(my_input):
    my_input += " String" # append another string to our input string
    return my_input # give the modified value back so we can overwrite old value
x = xy(x) # reassign the returned value of the function to overwrite this variable
print(x)
产出:

我的输入字符串

希望这说明,如果某个值被输入到函数中,则本地函数可以修改该值。然后应返回此修改后的值并用于覆盖旧值。这种技术不仅允许您将全局变量传递给其他函数进行修改,还允许将局部变量传递给函数进行修改。

我找到了答案

    x = ""
    def xy():
        global x 
        x = "String"

产生我想要的结果。

您可以将变量传递到函数中,这是最佳实践。也可以将函数的结果返回给变量。因此,您可以使用
return
将变量发回,而不是在函数中为x赋值,如下所示:

def xy(input):
    output = ''
    if input == 'Empty':
        output = 'Full'
    else:
        output = 'Empty'
    return output


x = 'Empty'
print(x)
>>> 'Empty'

# Update the result using xy()
x = xy(x)
print(x)
>>> 'Full'

# Once more
x = xy(x)
print(x)
>>> 'Empty'

global x
只是一个声明。在一行之后,您可以执行
x=“String”
来更改它的值。如果您搜索短语“Python函数变量范围”,您将找到比我们在这里的答案更好的资源来解释它。我很高兴您解决了您的问题!由于名称空间冲突,使用
全局
通常是不明智的。通常最好将变量传递到函数中。谢谢,我意识到这是一种不好的做法,很可能会在函数不修改任何内容的情况下进行重构。在这两种情况下,参数都会被完全忽略,因为您会立即创建具有相同名称的局部变量。这两个函数完全等效于
defxy():return“String”
。修改
x
的唯一原因是您为其指定了函数的返回值。这个答案很容易让人误解。@Thierrylahuille嗯,你说得有道理。我已将其更改为
+=
,因此它将附加到函数的任何输入,而不是像原始版本一样返回独立于输入的值。它仍然不会修改作为参数传递的变量。最后修改
x
的唯一原因是您在函数外执行了
x=…
。只需调用
xy(x)
,而不将结果分配回
x
,您将看到它保持不变。@Thierrylahuille感谢您的建设性反馈,我再次编辑了它,以强调应该返回值,然后用于覆盖原始值。现在更清楚了吗?