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

在Python3中更改方法内的全局字符串,python,string,methods,definition,Python,String,Methods,Definition,我在谷歌上搜索了我的问题,但没有找到答案。我的问题是: 我试图在Python3中更改方法中的字符串。我正在尝试这样一个小代码: number_a = 0 number_b = 1 word = 'empty' def something(): if number_a > number_b word = 'hello' else: word = 'goodbye' something() print(word) number_a =

我在谷歌上搜索了我的问题,但没有找到答案。我的问题是: 我试图在Python3中更改方法中的字符串。我正在尝试这样一个小代码:

number_a = 0
number_b = 1

word = 'empty'

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

something()
print(word)
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)
def something():
    return 'hello' if number_a > number_b else return 'goodbye'
Python给我的输出是

empty

我在这里做错了什么?

这个
word
变量只是把
word
变量隐藏在函数之外。这是一个范围问题。如果您想实际更改
word
,您可以使用
global
关键字,但更具python风格的方法如下:

number_a = 0
number_b = 1

word = 'empty'

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

something()
print(word)
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)
def something():
    return 'hello' if number_a > number_b else return 'goodbye'
另一个澄清是,你所写的是一篇文章

方法与对象相关联

编写此函数的更简单方法如下:

number_a = 0
number_b = 1

word = 'empty'

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

something()
print(word)
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)
def something():
    return 'hello' if number_a > number_b else return 'goodbye'

这样就不必对
单词
变量设置阴影。

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

def something():
  global word
  ...

您需要使用
global
关键字,因为函数中的单词是该函数的本地单词,但通常不是这样,您可以返回结果并将单词重新指定给返回值:

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"
但实际上,如果您希望值像这样进行全局更改,您可能应该使用一个类,其中word是一个属性:

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

函数假定变量是局部变量,默认情况下,赋值将创建一个新的局部变量来包含它。非局部全局变量不受影响

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

您可以通过显式地告诉Python它是您要为其赋值的全局变量来改变这种行为。为此,请使用
global
关键字将本地名称显式链接到全局变量:

def something():
    global word

    if number_a > number_b
        word = 'hello'
    else: 
        word = 'goodbye'
有时这是必要的。但是,在您的简单示例中,最好只返回值并在函数外部执行赋值。这样,函数就不会绑定到周围的命名空间:

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

word = something(a, b)

此处使用“只读”一词会产生误导。。问题是除非显式声明,否则变量的默认作用域是局部的。非常感谢。这是我丢失的“全局”关键字。