我很困惑python是如何迭代这本词典的。从python的文档中,itervalues返回字典值的迭代器。
dict = {"hello" : "wonderful", "today is" : "sunny", "more text" : "is always good"}
for x in dict.itervalues():
x = x[2:]
print dict
这会打印原始字典不变。这是为什么?如果我说位置x的值是“blabla”,为什么不设置?
答案 0 :(得分:7)
这与字符串或列表无关。魔鬼在于for
展开的方式。
做
for x in d.iteritems():
# loop body
或多或少等同于
iter = d.itervalues()
while True:
try:
x = next(iter)
# loop body
except StopIteration:
break
因此,考虑到这一点,我们不难发现我们只是重新分配x
,它保存了函数调用的结果。
iter = d.itervalues()
while True:
try:
x = next(iter)
x = 5 # There is nothing in this line about changing the values of d
except StopIteration:
break
答案 1 :(得分:5)
唯一的一行
x = x[2:]
确实创建字符串切片x[2:]
并重新绑定名称x
以指向此新字符串。它不会更改之前指向的字符串x
。 (字符串在Python中是不可变的,它们不能被更改。)
要实现您真正想要的,您需要使字典入口指向切片创建的新字符串对象:
for k, v in my_dict.iteritems():
my_dict[k] = v[2:]
答案 2 :(得分:1)
正如Sven Marnach指出的那样,字符串是不可变的,您只需将x
重新绑定到由切片表示法创建的新字符串。您可以使用x
来证明id
指向字典中的同一个对象:
>>> obj = 'hello'
>>> id(obj)
<<< 4318531232
>>> d = {'key': obj}
>>> [id(v) for v in d.values()]
<<< [4318531232]
>>> [id(v) for v in d.itervalues()]
<<< [4318531232]
>>> [(k, id(v)) for k, v in d.items()]
<<< [('key', 4318531232)]
>>> [(k, id(v)) for k, v in d.iteritems()]
<<< [('key', 4318531232)]
您可以使用iteritems
一起迭代键和值来执行您想要的操作:
for k,v in dict.iteritems():
dict[k] = v[2:]