[英]Inconsistent scope in python
我试过像这样创建一个 function :
n = ["one", "two"]
result=""
def join_strings(words):
for word in words:
result+=word
return result
print (join_strings(n))
这不起作用并输出:
UnboundLocalError: local variable 'result' referenced before assignment
结果变量必须在function 内才能工作。
但是,当我有这个简单的 function 时:
x=3
def price():
return (x+3)
print (price())
即使 x 在 function之外,这也可以工作并打印价格。 为什么会这样?
实际上没有不一致,因为您提供的示例彼此不同。 如果您尝试将x
分配给自身,它仍然会在第二个 function 中失败,例如:
>>> x = 3
>>> def price():
... x +=3
... return x
...
>>> price()
UnboundLocalError: local variable 'x' referenced before assignment
如果您选择另一个名称,而不是分配回x
,它将毫无问题地运行:
>>> def price():
... y = x + 3
... return y
...
>>> price()
6
这是因为 Python 的作用域规则。 您可以读取 function 之外的变量值,但不能更改它**。 当您执行x += 3
时,这与整数的x = x + 3
相同,这意味着“我有一个变量x
我可以在当前 scope 中对其进行写访问。 ”您没有这样的变量,因此正如错误所说:您在分配之前引用了“局部变量”。
是的。 您可以使用global
关键字,更改将应用于您的全局变量:
>>> x = 3
>>> def price():
... global x
... x += 3
... return x
...
>>> x
3
>>> price()
6
>>> x
6
** 通过改变,我的意思是给它分配别的东西,所以它的id
会改变。
不同之处在于,在第二个示例中,您没有尝试修改或重新分配x
。 (如果您在price
function 中说x += 3
之类的内容,您将得到相同的错误。)一旦您使用赋值运算符,您将一个新值绑定到该名称,从而隐藏外部 scope。
如果您希望能够从外部 scope 修改某些内容,请将其放入可变容器(如列表)中; 然后,您可以修改内容而无需重新分配该变量。
result = [""]
def join_strings(words):
for word in words:
result[0] += word
return result[0]
如果您只想能够引用result
值而不修改它,那也可以,但是您必须将其分配给一个新变量:
result = ""
def join_strings(words):
ret = result
for word in words:
ret += word
return ret
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.