簡體   English   中英

python 中的 scope 不一致

[英]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 中對其進行寫訪問。 ”您沒有這樣的變量,因此正如錯誤所說:您在分配之前引用了“局部變量”。

有沒有辦法在 function 中修改它們?

是的。 您可以使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM