【发布时间】:2020-05-22 13:50:12
【问题描述】:
我使用的是 Python 3.7.5 版
我发现我的代码中存在用于转换某些数据的错误,我已尽我所能创建该问题的最小工作示例。
首先,这是我期望的代码:
a = ['foo','bar']
b = ['spam','eggs']
c = {'glue':a, 'dill':b}
for i in range(23,25):
c['dill'] = c['dill'] + [i]
print(b)
print(c)
# ['spam', 'eggs']
# {'glue': ['foo', 'bar'], 'dill': ['spam', 'eggs', 23, 24]}
即for循环中的代码不会影响b的值。
但是当我切换到使用增量运算符时,情况就不再是这样了:
a = ['foo','bar']
b = ['spam','eggs']
c = {'glue':a, 'dill':b}
for i in range(23,25):
c['dill'] += [i]
print(b)
print(c)
# ['spam', 'eggs', 23, 24]
# {'glue': ['foo', 'bar'], 'dill': ['spam', 'eggs', 23, 24]}
在使用 Python 时,我一直有这样的印象:
-
a += 1和a = a + 1做了同样的事情 - 当一个变量基于另一个变量 (
b=a) 定义时,对新变量 (b=f(b)) 的后续更改不会影响原始变量
上面的例子似乎违反了这两个假设。怎么回事?
【问题讨论】:
-
这个答案stackoverflow.com/a/823878/7648578 似乎涵盖了它。 "
+总是返回一个新分配的对象,但如果对象是可变的,+=应该(但不必)就地修改对象(例如list或dict,但int和@987654335 @ 是不可变的)。”
标签: python python-3.x