【问题标题】:Difference between + and += [duplicate]+ 和 += 之间的区别 [重复]
【发布时间】:2021-09-29 21:28:28
【问题描述】:

为什么它会给出不同的输出:

+和+=有区别吗

def func1(lst1, lst2):
    lst1 += lst2

lst1 = [1, 2, 3]
lst2 = ["a", "b"]
func1(lst1, lst2)
print(lst1)

def func1(lst1, lst2):
    lst1 = lst1 + lst2
    
lst1 = [1, 2, 3]
lst2 = ["a", "b"]
func1(lst1, lst2)
print(lst1)

提前致谢

【问题讨论】:

  • 第一个程序给出:[1,2,3] 第二个:[1,2,3,'a','b','c']
  • 这能回答你的问题吗? What exactly does += do in python?
  • @NirAlfasi 在 3.8 中运行我也得到两个不同的输出。诚实的问题,如果这两个运算符相同并且只是语法糖(这是我的假设),为什么我们会从 print()lst1 得到两个不同的响应?
  • 这能回答你的问题吗? Why does += behave unexpectedly on lists?
  • @NirAlfasi 我删除了那部分,我的错。

标签: python


【解决方案1】:

这里的区别在于+= 改变了初始列表lst1。而lst1 = lst1 + lst2 创建一个新列表并重写不影响全局对象lst1 的局部引用lst1。如果您在函数内部尝试printing lst1,两种情况都会给您相同的结果。

【讨论】:

    【解决方案2】:

    在您的第一个示例中,您传递了对 lst1 的引用。因此,增量会影响 lst1 所引用的列表。

    在您的第二个示例中,您还传递了一个引用操作 lst1 + lst2 创建了一个新的列表实例,并且 lst1 随后指向该实例。因此,您的原始列表不受影响。

    您需要决定是否真的要修改 lst1 或者是否想知道这两个列表相加后的样子

    【讨论】:

      【解决方案3】:

      一个好的 IDE 会给你一个提示,像这样:

      如果您认出lst1 的深灰色,请将鼠标移到它上面,它会给您一个提示。在这里,问题是没有使用局部变量,正如@Yevhen Kuzmovych所解释的那样。

      += 可以有与+ 不同的实现。列表就是这种情况:+= 会就地修改列表,而 + 会为您提供一个新列表,并且在左侧使用相同的名称会使这不那么明显。

      它还说您有一个命名问题,称为 shadowing。您是否期望外部范围的lst1 更新,因为它具有相同的名称?如果你这么认为,你需要阅读scope。如果您了解另一种编程语言,您还想了解按值传递按引用传递按赋值传递之间的区别(Python) .

      【讨论】:

        猜你喜欢
        • 2014-08-16
        • 2011-04-08
        • 2012-11-24
        • 2013-06-05
        • 2020-05-27
        • 2016-03-23
        • 2012-08-11
        • 2012-11-24
        • 2017-07-19
        相关资源
        最近更新 更多