簡體   English   中英

變量范圍(局部全局和非局部)如何適用於 Python 中的 List 等可變對象?

[英]How Scope of variable (local global and nonlocal) work for mutable object like List in Python?

我正在編寫如下程序來測試我對 Python 變量范圍的了解

def show(a,b):
    def add():
        a = a+b #Error at this line "UnboundLocalError: local variable 'a' referenced before assignment" 
#I know we can use nonlocal a,b to avoid error 
    add()
    print("a=",a)
x=4
y=2
show(x,y)

然后我嘗試了相同的程序,並以 x 和 y 作為列表進行了一些小改動。 代碼如下圖

def show(a,b):
    def add():
        a[0] = a[0]+b[0] #No Error at this line
    add()
    print("a=",a[0])

x=[4]
y=[2]
show(x,y)

這段代碼運行良好。 我在 python 中沒有得到這種奇怪的行為。

所有變量的范圍規則都相同。 它們引用什么對象並不重要。

但是, a = a + ba[0] = a[0] + b[0]是不同的東西。

  1. 第一個是分配給一個全局變量,該變量實際上被 Python視為本地變量。 詳細信息可以在這篇文章中找到: Python 函數全局變量?

  2. 第二個是語法糖,做作業! 它被脫糖(在內部翻譯)到對__setitem__的調用:

     a.__setitem__(0, a[0] + b[0])

    正如您所看到的,這里沒有分配,上面的第 (1) 點不適用,所以這里沒有問題。

一般來說,像a[i] = b這樣a[i] = b代碼會被翻譯成a.__setitem__(i, b) ,其他一些語法也會被翻譯成函數調用,比如a + b可以是a.__add__(b) , a[0]a.__getitem__(0)等等。

所以, a[0] = a[0] + b[0]最終會成為這個怪物:

a.__setitem__(0, a.__getitem__(0).__add__(b.__getitem__(0)))

沒有賦值 - 全局變量突然變成局部沒有問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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