在Python3中更改方法内的全局字符串
我在谷歌上搜索了我的问题,但没有找到答案。我的问题是: 我试图在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 =
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)
此处使用“只读”一词会产生误导。。问题是除非显式声明,否则变量的默认作用域是局部的。非常感谢。这是我丢失的“全局”关键字。