Python在函数中更改变量与数组?

Python在函数中更改变量与数组?,python,function,methods,immutability,mutable,Python,Function,Methods,Immutability,Mutable,我对从函数内部更改(变异或追加)变量有点困惑。 作为参考,我发现这个问题是关于。它描述了如何在阵列上执行此操作: def add_thing(a): a.append(2) my_a = [1] append_two(my_a) my_a >>> [1,2] 我们使用a+=[2]得到相同的结果 但是,如果我们使用字符串或整数尝试相同的操作: def add_world (s): s += " world" my_str = "

我对从函数内部更改(变异或追加)变量有点困惑。
作为参考,我发现这个问题是关于。它描述了如何在阵列上执行此操作:

def add_thing(a):
    a.append(2)

my_a = [1]

append_two(my_a)
my_a
>>> [1,2]
我们使用a+=[2]得到相同的结果

但是,如果我们使用字符串或整数尝试相同的操作:

def add_world (s):
    s += " world"

my_str = "hello"

add_world(my_str)
my_str
>>> "hello"
它不会改变,整数也是如此,比如:

def add_one(i):
    i += 1

x = 1
add_one(x)
x
>>> 1
我的问题是:

  • 我应该如何识别哪些对象可以在数组之类的函数中变异,哪些对象需要直接赋值

  • 为什么+=操作符没有像我期望的那样工作?我相当确定这是我的_var=my _var+东西的简写,在一个函数中工作得很好

  • 你必须看一下文档。通常:数字、字符串和元组是不可变的

    关于特定的方法,还有一条一般规则:如果方法返回某些东西,那么它不会修改参数。修改参数的方法返回
    None

  • 如果
    a
    是不可变的,则
    a+=b
    相当于
    a=a+b
    。如果
    a
    是可变的,那么使用
    +=
    将使对象发生变异。基本上,
    +=
    只是一个方法调用(到
    \uuuidd\uuuu
    )。在不可变对象的情况下,该方法返回一个新对象,不改变原始值;对于可变对象,该对象改变,并返回自身

  • 我应该如何识别哪些对象可以在数组之类的函数中变异,哪些对象需要直接赋值

    您需要了解正在使用的对象类型,并阅读这些对象的文档,以了解哪些操作(如果有的话)会对它们进行修改。不幸的是,对于
    列表
    而言,这并不是以最容易访问的方式记录的。最贴切的说法是:

    x+=1
    这样的增广赋值表达式可以重写为
    x=x+1
    ,以获得类似但不完全相同的效果。在增强版本中,x只计算一次。此外,在可能的情况下,实际操作在适当的位置执行,这意味着不创建新对象并将其分配给目标,而是修改旧对象

    由于列表是可变的,这意味着就地操作是可能的

    为什么+=操作符没有像我期望的那样工作?我相当确定这是我的_var=my _var+东西的简写,在一个函数中工作得很好


    如上所述,
    a+=b
    a=a+b
    并不完全相同。区别在于对象
    a
    有机会定义
    a+=b
    的特殊行为,这可能不同于
    a+b
    的行为。列表这样做是为了
    +=
    工作到位。

    可能的副本可能的副本仔细阅读,最好两次。这会帮你解决一些问题。谢谢大家,我很确定这是一个覆盖范围很广的地区,我就是找不到任何具体的东西。