在 python 3 中的方法内更改全局字符串

Change global string within a method in python 3

我用谷歌搜索了我的问题,但未能找到答案。我的问题是: 我试图在 python 3 中的方法中更改字符串。我正在尝试这样的小代码:

number_a = 0
number_b = 1

word = 'empty'

def something():
    if number_a > number_b
        word = 'hello'
    else: 
        word = 'goodbye'

something()
print(word)

Python 给我的输出是

empty

我做错了什么?

word 变量仅在函数外隐藏 word 变量。这是一个范围问题。如果你想真正改变 word 你可以使用 global 关键字,但更像 pythonic 的方法是这样的:

number_a = 0
number_b = 1

word = 'empty'

def something():
    if number_a > number_b:
        word = 'hello'
    else: 
        word = 'goodbye'
    return word

word = something()
print(word)

另外一个说明是你写的是 function and not a method.

方法与对象关联。

写这个函数的更简单的方法应该是这样的:

def something():
    return 'hello' if number_a > number_b else return 'goodbye'

那么您根本就不必隐藏 word 变量。

这里的问题是您没有修改字符串,而是重新分配局部变量。该变量在函数之外没有范围,除非您声明名称 word 具有全局绑定。因此,要解决此问题,您需要告诉解释器您正在影响函数内的全局变量。

def something():
  global word
  ...

您需要使用 global 关键字,因为函数中的单词是该函数的 local 但这通常不是正确的方法,您可以 return 结果并将单词重新分配给 returned 值:

word = 'empty'

def something():
   return 'hello'if number_a > number_b else  'goodbye'

word = something()
print(word)

另一种方法是将单词放入 可变 结构中:

word = ['empty']


def something():
    if number_a > number_b:
        word[0] = 'hello'
    else:
        word[0] = 'goodbye'
something()
print(word[0]) -> "goodbye"

但实际上,如果您希望值像这样全局更改,您可能应该使用 class,其中单词是一个属性:

class Foo():
    def __init__(self,word,n1,n2):
        self.word = word
        self.number_a = n1
        self.number_b = n2

    def something(self):
        if self.number_a > self.number_b:
            self.word = 'hello'
        else:
            self.word = 'goodbye'

inst = Foo("empty",0,1)

inst.something()
print(inst.word)
goodbye

函数假设变量是局部的,并且赋值将默认创建一个新的局部变量来包含它。非本地 global 变量不受影响。

这是可取的。否则,您将不得不为所有内容创建唯一的名称,并且总是冒着意外覆盖重要全局变量的风险。

您可以通过显式告诉 Python 它是您要为其赋值的全局变量来更改此行为。为此,使用 global 关键字显式 link 局部名称到全局变量:

def something():
    global word

    if number_a > number_b
        word = 'hello'
    else: 
        word = 'goodbye'

有时这是必要的。但是,在您的简单示例中,只 return 值并在函数外部进行赋值可能会更好。这样函数就不会绑定到周围的命名空间:

def something(number_a, number_b):
    if number_a > number_b
        return 'hello'
    else: 
        return 'goodbye'

word = something(a, b)