python中的作用域不一致
我尝试过创建这样的函数:python中的作用域不一致,python,function,scope,Python,Function,Scope,我尝试过创建这样的函数: 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 结果变量必须位于函数内部才能工作 但是,当
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
结果变量必须位于函数内部才能工作
但是,当我有这个简单的函数时:
x=3
def price():
return (x+3)
print (price())
即使x在函数的之外,它也可以工作并打印价格。为什么会发生这种情况?不同之处在于,在第二个示例中,您没有尝试修改或重新分配
x
。(如果在price
函数中说类似于x+=3
的话,您将得到相同的错误。)一旦使用赋值运算符,您将为该名称绑定一个新值,并隐藏外部范围
如果您希望能够从外部范围修改某些内容,请将其放入可变容器(如列表)中;然后可以修改内容,而无需重新分配该变量
result = [""]
def join_strings(words):
for word in words:
result[0] += word
return result[0]
如果您只想能够引用结果
值,而不需要修改它,也可以,但您必须将其分配给一个新变量,然后:
result = ""
def join_strings(words):
ret = result
for word in words:
ret += word
return ret
事实上并没有不一致的地方,因为你们给出的例子彼此不同。如果您尝试将
x
分配给自身,则在第二个函数中仍然会失败,如:
>>> 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的作用域规则。您可以在函数之外读取变量的值,但不能更改它**。当您执行x+=3
,这与整数的x=x+3
相同,这意味着“我有一个变量x
,我在当前范围内对它有写访问权限。”您没有这样的变量,因此错误显示:您在赋值之前引用了“局部变量”
有没有办法在函数中修改它们?
对。您可以使用global
关键字,更改将应用于您的全局变量:
>>> x = 3
>>> def price():
... global x
... x += 3
... return x
...
>>> x
3
>>> price()
6
>>> x
6
**通过更改,我的意思是为它分配其他内容,使其
id
将更改。。。。或者只需向函数添加一个参数,就可以将其传递给要操作的对象,而不依赖于外部范围中的变量。