簡體   English   中英

什么是在封閉范圍內的賦值錯誤之前避免引用的Pythonic方法?

[英]What is the Pythonic way to avoid reference before assignment errors in enclosing scopes?

我說的是一般情況。 這是一個例子:

c = 1
def a():
    def b():
        print(c)
    b()
    c = 2

a()

此代碼將返回以下錯誤: NameError: free variable 'c' referenced before assignment in enclosing scope 雖然邏輯假設是輸出應為1 什么是Pythonic解決這個問題的方法? 使用global或非nonlocal語句(我不喜歡)? 也許只是避免這種情況,多個范圍共享具有相同名稱的變量?


將其作為參數傳遞

當傳遞外部變量作為參數時,避免重復使用名稱,除非此變量不可能將任何其他變量作為參數處理,然后它並不重要,否則如果您下次傳遞d並執行操作將會造成混淆在函數內的c

其次,當作為變量傳遞時,即使將名稱從param更改為c (它具有非常小的含義) c 的值 也不會在函數內被修改,因為它不被視為全局變量,即使變量是對象它也是如此除非您將其傳遞給類,否則它將只是此函數中的對象。

c = 1
def a(param):
    def b():
        print(param)
    b()
    param = 2

a(c)

如果您不想將其作為參數傳遞,並且仍希望影響函數外部的c ,則需要堅持使用全局選項。 全局選項影響你想要它的“外部”c變量..但這並不是真正的最佳實踐,如果可能的話,請將其作為最佳實踐。

c = 1
def a():
    global c
    def b():
        print(c)
    b()
    c = 2

a()

這是我建議的:

c = 1
def a(param):
    def b():
        print(param)
    b()
    param = 2
    return param

c = a(c)

甚至:

c = 1
def b(param):
    print(param)
def a(param):
    b(param)
    param = 2
    return param

c = a(c)

暫無
暫無

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

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