【问题标题】:Python changing variables vs arrays in functions?Python改变函数中的变量和数组?
【发布时间】:2015-12-15 22:25:57
【问题描述】:

我对从函数内部更改(变异或附加)变量有点困惑。
作为参考,我发现了这个关于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 + 事物的简写,它可以在函数中正常工作。

【问题讨论】:

标签: python function methods immutability mutable


【解决方案1】:
  1. 您必须查看文档。通常:数字、字符串和tuples 是不可变的。

    关于特定的方法,还有一个通用的规则:如果方法返回,那么它不会修改参数。修改参数的方法返回None

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

【讨论】:

    【解决方案2】:

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

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

    x += 1 这样的增强赋值表达式可以重写为x = x + 1 以实现类似但不完全相等的效果。在增强版本中,x 只被评估一次。此外,如果可能,实际操作会在原地执行,这意味着不是创建新对象并将其分配给目标,而是修改旧对象。

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

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

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

    【讨论】:

      猜你喜欢
      • 2015-05-04
      • 1970-01-01
      • 2015-11-11
      • 2013-03-22
      • 1970-01-01
      • 2021-05-31
      • 2023-04-03
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多