Python 为什么我可以通过引用键而不是值本身来更改dict值?

Python 为什么我可以通过引用键而不是值本身来更改dict值?,python,Python,这是我的代码: # Write your add_ten function here: def add_ten(dic): for key, val in dic.items(): dic[key] += 10 return dic # Uncomment these function calls to test your function: print(add_ten({1:5, 2:2, 3:3})) # should print {1:15, 2:12, 3:13} #p

这是我的代码:

# Write your add_ten function here:
def add_ten(dic):
  for key, val in dic.items():
    dic[key] += 10
  return dic
# Uncomment these function calls to test your  function:
print(add_ten({1:5, 2:2, 3:3}))
# should print {1:15, 2:12, 3:13}
#print(add_ten({10:1, 100:2, 1000:3}))
# should print {10:11, 100:12, 1000:13}

这是可行的,但最初我做到了:

for val in dick.values():
    val += 10
使用visualizer,该值增加了10,但未保存该值。为什么?

在这个循环中:

for val in dick.values():
    val += 10
val
不是字典中可变值的引用
val+=10
实现为
val=val+10
——您正在重新分配局部变量
val
,而不是修改初始化时使用的原始字典值。

在此循环中:

for val in dick.values():
    val += 10

val
不是字典中可变值的引用
val+=10
实现为
val=val+10
——您正在重新分配局部变量
val
,而不是修改初始化时使用的原始字典值。

,因为某些对象是可变的,而其他对象是不可变的。在您的情况下,整数是不可变的,因此dct的内容只能通过赋值来更改-您希望将新值赋值给dict,而不是其他变量名,指向同一个不可变对象。能否更改词典名称?因为
val
只是一个临时变量,在下一次循环迭代中将被覆盖。您不想更改
val
,而是要更改字典中的值。这就是您的解决方案不起作用的原因。
val+=10
val=val.\uuu iadd\uuu10
的缩写。由于没有实现
int.\uuuu iadd\uuuuuuuu
,Python会退回到
val=val.\uuuuu添加(10)
。因此,您只是为名称
val
指定了一个新值,而不是对
val
引用的
dict
中存储的对象进行变异。因为有些对象是可变的,而其他对象是不可变的。在您的情况下,整数是不可变的,因此dct的内容只能通过赋值来更改-您希望将新值赋值给dict,而不是其他变量名,指向同一个不可变对象。能否更改词典名称?因为
val
只是一个临时变量,在下一次循环迭代中将被覆盖。您不想更改
val
,而是要更改字典中的值。这就是您的解决方案不起作用的原因。
val+=10
val=val.\uuu iadd\uuu10
的缩写。由于没有实现
int.\uuuu iadd\uuuuuuuu
,Python会退回到
val=val.\uuuuu添加(10)
。因此,您只是为名称
val
指定了一个新值,而不是对
val
引用的
dict
中存储的对象进行变异。