7

我很困惑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”,为什么它没有被设置?

4

3 回答 3

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
于 2011-08-10T19:38:35.297 回答
5

唯一的线路

x = x[2:]

所做的是创建字符串切片x[2:]并重新绑定名称x以指向这个新字符串。它不会更改x之前指向的字符串。(字符串在 Python 中是不可变的,不能更改。)

要实现您真正想要的,您需要使字典入口点指向切片创建的新字符串对象:

for k, v in my_dict.iteritems():
    my_dict[k] = v[2:] 
于 2011-08-10T19:38:44.073 回答
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:]
于 2011-08-10T19:39:50.500 回答