Python 调用方法的作用是什么?

Python 调用方法的作用是什么?,python,string,Python,String,好的,没问题 我有这个密码 list = ['random', 'set', 'of', 'strings'] for item in list: item.replace('a','b') print list 除非我将代码更改为此,否则输出不会显示替换 list = ['random', 'set', 'of', 'strings'] for i

好的,没问题

我有这个密码

           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

所以我的问题是到底发生了什么?为什么第一个例子不能自动赋值?

第二个例子也错了

list = [item.replace('a','b') for item in list]
该方法只返回新值,而不修改现有值

没有规定所有或任何方法都可以执行此操作的既定规则,您必须检查每个方法的文档,以明确了解它的功能和预期效果

很多函数都是这样的

拿这个来说:

a = 1
b = 2
c = Add(a, b)
此时,您希望a或b具有新值吗?这是完全一样的事情

话虽如此,您的代码还有另一个问题。在任何情况下,该清单都不会改变

为什么??因为您没有更新列表,所以您正在更新项目

项是列表中值的副本。这并不是严格正确的,但对于这个答案来说,了解更多信息的参考资料就足够了

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

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

然后你会看到不同

对评论中后续问题的回答:如果您不将结果存储在任何地方,它将丢失。这样想:你打电话给你的朋友,问他现在几点值班。他说10点45分,你回答说我不在乎

“random”是字符串对象,“set”是字符串对象等

列表是字符串对象的集合

对于列表中的项目: 将名称aka标识符项依次指定给对象列表列出的每个对象。赋值意味着在名称和对象之间创建绑定

对于循环的每一圈,在将项分配给列表的当前对象item.replace'a'之后,执行'b': replace创建一个新对象,该对象的值与名为item的对象的值相同,但将“a”替换为“b”。 这种创造发生在哪里?在记忆中。新对象是在RAM中的某个位置物理创建的,对象具有地址、类型和值。 然后?好吧,然后,什么都没有。对象就在RAM中,它没有任何名称的赋值。因此,它将或多或少地快速消亡,也就是说,新对象占用的位将或多或少地快速重用,而不需要解释器的关心,因为它不可能知道那里有一个对象,因为这个对象没有被标识符引用

情况大致相同。 不同之处在于,创建后,指令项生成的对象。替换“a”,将“b”指定给名称项。或者,如果愿意,将名称项重新指定给新对象。 那么,新的物体不会死?唉,它会的。因为在循环的下一个循环中,list中item的指令会将name item新赋值给list的下一个元素


现在,您还应该理解为什么用名称列表调用列表是一种不好的做法。因为list是内置函数的名称,定义list=['random','set','of','strings']会产生一个结果:名称列表和对象函数列表之间的原始内置绑定被破坏,并替换为列表和上述字符串集合之间的绑定

但在这种情况下,它将返回到哪里?我明白你关于列表未被更改的观点,但我再次问,在第一种情况下,函数将值返回到哪里?@Timtam:它将返回它,故事结束。返回字符串的情况取决于调用的上下文。如果调用位于赋值的右侧,它将用作同一赋值左侧对象的新值。如果它是一个更大表达式的一部分,它将用于该表达式的求值。如果没有,则返回值,然后扔掉。不,这有很多用途,有很多方法有副作用,还返回一些你可能关心或不关心的东西。此外,如果你要解决这个问题唯一要做的就是引入一个你无论如何都不会使用的虚拟变量,那么拥有这个变量有什么意义呢?无论哪种方式,你都会发现它在任何地方都是正常的,所以最好接受它,也就是说,接受这个事实,它是合法和正常的,不必接受我的答案而不是对抗它。@ TimTAM我考虑了Python无变量的数据模型,只有指针绑定到标识符的对象引用为Python中要知道的最重要的第1个数字。事实上,名称到对象的绑定是由Python通过将名称直接绑定到包含指向对象的地址的指针来完成的。名称和对象之间的绑定实际上是间接的。这是一个执行模型,它通过读取指针中的地址来执行对象的本地化,给定名称和指针之间的绑定pointer@Timtam 顺便说一句,我写了一个包含地址的指针:听起来好像指针是一个变量,意思是“内容可以更改的内存块”。事实上,我认为Python使用的底层指针实际上就是这个意义上的变量。但它们不能直接修改。它们的值仅在执行赋值时更改。
list = ['random', 'set', 'of', 'string']
for item in list:
    item = item.replace('a','b')
    print item
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