【问题标题】:Setting a variable outside a function in Python在 Python 中的函数外部设置变量
【发布时间】:2019-08-02 07:30:03
【问题描述】:

假设我们有这样的构造:

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

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

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

产生无效语法的语法错误。 为什么?

提前感谢您的帮助。

【问题讨论】:

  • global x 只是一个声明。按照其中包含的一行,然后您可以执行 x = "String" 来更改其值。
  • 如果您搜索短语“Python 函数变量范围”,您会发现可以比我们在此处的答案中更好地解释它的资源。

标签: python scope namespaces global-variables


【解决方案1】:

我找到了答案。

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

得到我想要的结果。

【讨论】:

  • 很高兴您解决了您的问题!由于名称空间冲突,通常不建议使用global。通常最好将变量传递给函数。
  • 谢谢,我知道这是不好的做法,可能很快就会重构
【解决方案2】:

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

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)

输出:

我的输入字符串

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

【讨论】:

  • 您的函数不会修改任何内容。在这两种情况下,该参数都会被完全忽略,因为您会立即创建一个同名的局部变量。你的两个函数都完全等同于def xy(): return "String"。修改x 的唯一原因是您为其分配了函数的返回值。这个答案非常具有误导性。
  • @ThierryLathuille 嗯,你说得有道理。我已将其更改为+=,因此它会附加到函数的输入内容,而不是像原始版本一样返回与输入无关的值
  • 它仍然不会修改您作为参数传递的变量。最后修改x的唯一原因是因为你在函数之外做了x = ...。只需调用xy(x) 而不将结果分配回x,您会看到它保持不变。
  • @ThierryLathuille 感谢您的建设性反馈,我再次对其进行了编辑,以强调应该返回该值,然后用于覆盖原始值。现在更清楚了吗?
【解决方案3】:

您可以将变量传递给函数,这是最佳实践。您也可以将函数的结果返回给变量。因此,您可以使用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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    相关资源
    最近更新 更多