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
将更改。

。。。或者只需向函数添加一个参数,就可以将其传递给要操作的对象,而不依赖于外部范围中的变量。