【问题标题】:difference between += and append() in Python [duplicate]Python中+ =和append()之间的区别[重复]
【发布时间】:2022-01-14 20:43:51
【问题描述】:

当我在函数中使用 += 时,出现以下错误:UnboundLocalError: local variable 'travel_log' referenced before assignment 但它完全适用于 append() 函数。 有什么区别?

travel_log = []
def add_new_country(countries_visited, times_visited, cities_visited):
    new_country = {}
    new_country["country"] = countries_visited
    travel_log += new_country

【问题讨论】:

  • 因为在这种情况下+= 涉及global var 赋值
  • 编码新手 :) 你能解释一下吗?
  • stackoverflow.com/a/2022044/17184842同一个问题的详细解答。
  • 函数中的任何赋值anywhere 都会被编译器标记为local+= 涉及对travel_log 的赋值,但在该行之前没有定义局部变量

标签: python append


【解决方案1】:

因为您在 add_new_country 函数中分配了 travel_log+= 是一个赋值),所以它被认为是该函数中的局部变量。因为它是一个局部变量,并且您从未为它赋值,所以当您尝试对其进行 += 时,travel_log 没有任何值。 Python 不会回退到使用同名的全局变量。

这有点令人惊讶,因为列表上的+= 操作等效于调用其extend() 方法,并且名称仍然绑定到同一个列表。当变量是数字或其他不可变对象时,错误感觉更合理。但这是相同的行为。

如果要对全局变量进行操作,就这么说吧:

def add_new_country(countries_visited, times_visited, cities_visited):
    global travel_log
    # etc.

但最好使用travel_log.append()。追加不是分配,因此它不会使 travel_log 成为本地。

【讨论】:

    【解决方案2】:

    这是因为当您对作用域中的变量进行赋值时,该变量成为该作用域的本地变量,并隐藏外部作用域中任何类似命名的变量。由于add_new_country() 中的最后一条语句为travel_log 分配了一个新值,因此编译器将其识别为局部变量。

    在 Python 中,仅在函数内部引用的变量是隐式全局的。如果一个变量在函数体中的任何位置被赋值,除非明确声明为全局变量,否则它被假定为局部变量。

    因此,在您的情况下,将 travel_log 声明为函数内的全局范围

    travel_log = []
    
    def add_new_country(countries_visited, times_visited, cities_visited):
        # now function will refer the globally declared variable
        global travel_log
        new_country = {}
        new_country["country"] = countries_visited
        travel_log += new_country
    

    查看此博客以获得详细说明:https://docs.python.org/3/faq/programming.html#why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value

    【讨论】:

      猜你喜欢
      • 2014-12-07
      • 2016-09-02
      • 2021-09-30
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-16
      • 2011-04-08
      相关资源
      最近更新 更多