调用方法有什么作用?

时间:2011-07-31 22:17:51

标签: python string

好的,没有问题

我有这个代码

           list = ['random', 'set', 'of', 'strings']
           for item in list:
               item.replace('a','b')

           print list

除非我将代码更改为

,否则输出不会显示替换
            list = ['random', 'set', 'of', 'strings']
            for item in list:
                item = item.replace('a','b')

            print list

所以我的问题是到底发生了什么?为什么第一个例子没有自动分配?

3 个答案:

答案 0 :(得分:5)

该方法只是返回新值,它不会修改现有值。

没有设置规则指定所有或没有方法都会执行此操作,您必须检查每个方法的文档,以明确知道它的作用和期望。

很多功能就是这样。

拿这个:

a = 1
b = 2
c = Add(a, b)

你希望a或b在这一点上有新值吗?这是完全相同的。

现在,说完了,您的代码还有另一个问题。在任何情况下,该列表都不会发生变化。

为什么呢?由于您没有更新列表,因此您正在更新项目

item 是列表中值的“副本”。这不是严格正确的,但它足以满足这个答案(了解更多信息参考参考资料。)

换句话说,如果您将两个示例更改为:

list = ['random', 'set', 'of', 'string']
for item in list:
    item.replace('a','b')
    print item

VS

list = ['random', 'set', 'of', 'string']
for item in list:
    item = item.replace('a','b')
    print item

然后你会发现不同之处。

在评论中回答后续问题:如果您没有将结果存储在任何地方,那么它就会丢失。可以这样想:你打电话给你的朋友,问他的手表什么时间。他说“10:45”,你回答“其实我不在乎点击。”

答案 1 :(得分:4)

第二个也错了

list = [item.replace('a','b') for item in list]

答案 2 :(得分:1)

list = ['random', 'set', 'of', 'strings']
for item in list:
    item.replace('a','b')
print list

'random'是一个字符串对象,'set'是一个字符串对象,等等

list 是字符串对象的集合

for item in list:
将名称(又名标识符)连续分配给对象列表列出的每个对象。分配意味着创建名称和对象之间的绑定。

对于循环的每个回合,在项目分配给列表的当前对象后,执行item.replace('a','b')
replace()创建一个与名为 item 的对象具有相同值的新对象,但将'a'替换为'b'。
这种创造在哪里发生?在记忆中。新对象在RAM中的某处物理创建,对象具有地址,类型和值 然后 ?嗯,然后,没什么。对象就在那里,在RAM中,并没有得到任何名称的分配。因此它会或多或少地快速死亡,也就是说新对象占用的位将被或多或少地快速重用,而不需要任何解释器,因为它不可能知道那里有一个对象,因为标识符未引用此对象。

list = ['random', 'set', 'of', 'strings']
for item in list:
    item = item.replace('a','b')
print list

它大致相同。 不同之处在于,创建后,将指令item.replace('a','b')生成的对象分配给名称。或者,如果您愿意,可以将名称重新分配给新对象 那么,新对象不会死?唉,它会的。因为在循环的下一个回合中,指令for item in list列表

的下一个元素执行名称的新分配

现在您还应该了解为什么调用名称为 list 的列表是不好的做法。因为列表是内置函数的名称,并且定义list = ['random', 'set', 'of', 'strings']具有以下结果:名称列表与对象之间的原始内置绑定函数 list()已被破坏,并替换为 list 与上述字符串集合之间的绑定。