我有这个代码
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
所以我的问题是到底发生了什么?为什么第一个例子没有自动分配?
答案 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 与上述字符串集合之间的绑定。