在 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)
我用谷歌搜索了我的问题,但未能找到答案。我的问题是: 我试图在 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)