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

Python changing variables vs arrays in functions?

我对从函数内部更改(改变或附加)变量感到有点困惑。
作为参考,我发现了这个关于 functions that mutate the argument 的问题。它描述了在数组上这样做:

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

my_a = [1]

append_two(my_a)
my_a
>>> [1,2]

我们使用 += [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

我的问题是:

  1. 我应该如何识别我可以在函数(如数组)中改变哪些对象,以及哪些我需要直接分配?

  2. 为什么 += 运算符没有像我预期的那样工作?我相当确定它是 my_var = my_var + thing 的简写,它在函数中可以正常工作。

  1. 你得看看文档。通常:数字、字符串和 tuple 是不可变的。

    关于具体的方法,也有一个通用规则:如果方法returns something 则它不会修改参数。修改参数 return None 的方法。

  2. 如果 a 是不可变的,
  3. a += b 等价于 a = a + b。如果 a 是可变的,那么使用 += 将改变对象。基本上 += 只是一个方法调用(对 __iadd__)。在不可变对象的情况下,方法 return 是一个新对象并且不会改变原始值,对于可变对象,对象是变异的并且它 return 是它自己。

How should I recognize which objects I can mutate in a function like an array, and which ones I need to directly assign?

您需要知道您正在使用的对象类型并阅读这些对象的文档以了解哪些操作(如果有的话)会改变它们。不幸的是,在 list 的情况下,这没有以最容易访问的方式记录下来。最接近的是 this 表示:

An augmented assignment expression like x += 1 can be rewritten as x = x + 1 to achieve a similar, but not exactly equal effect. In the augmented version, x is only evaluated once. Also, when possible, the actual operation is performed in-place, meaning that rather than creating a new object and assigning that to the target, the old object is modified instead.

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

why is the += operator not working as I'd expect? I was fairly sure that it was short hand for my_var = my_var + thing, which aught to work just fine within a function.

如上引述所示,a += ba = a + b 并不完全相同。不同之处在于对象 a 有机会为 a += b 定义可能不同于 a + b 的行为的特殊行为。列表这样做是为了 += 就地工作。